我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在Stack Overflow上找到了另一个脚本,看起来几乎与它完全一样,但它不会失败。

所以为了帮助我学习,有人能帮我确定原型脚本哪里出错吗?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

重复问题的更多答案:

从JS数组中删除重复值

类似的问题:

获取数组中的所有非唯一值(即:重复/多次出现)


当前回答

您也可以使用sugar.js:

[1,2,2,3,1].unique() // => [1,2,3]

[{id:5, name:"Jay"}, {id:6, name:"Jay"}, {id: 5, name:"Jay"}].unique('id') 
  // => [{id:5, name:"Jay"}, {id:6, name:"Jay"}]

其他回答

这个解决方案应该非常快,并且在很多情况下都有效。

将索引数组项转换为对象键使用Object.keys函数var indexArray=[“hi”,“welcome”,“欢迎”,1,-9];var keyArray={};indexArray.forEach(函数(项){keyArray[item]=null;});var uniqueArray=对象.keys(keyArray);

ES2016.includes()一种方法简单答案:

var arr = [1,5,2,4,1,6]
function getOrigs(arr) {
  let unique = []
  arr && arr.forEach(number => {
    !unique.includes(number) && unique.push(number)
    if (number === arr[arr.length - 1]) {
      console.log('unique: ', unique)
    }
  })
}
getOrigs(arr)

请改用此选项:

更新的ES版本简单问题不应使用多个高级JS方法,push()、length()和forEach()是常见的使用闭包更容易阅读在内存、垃圾收集和性能方面似乎比其他产品更好更少的代码行:如果您根据行结尾的位置分隔行,则只需要一行逻辑(因此您可以根据需要调用或重构这一行):

var arr = [1,5,2,4,1,6];
function getOrigs(arr) {let unique = []; 
  arr && arr.forEach(number => !unique.includes(number) && unique.push(number) && ((number === arr[arr.length - 1]) && console.log('unique: ', unique)))};
getOrigs(arr);

我使用Array#reduce作为创建Array#unique的方法

Array.prototype.unique=函数(){var object=this.reduce(函数(h,v){h[v]=真;返回h;}, {});return Object.keys(对象);}console.log([“a”,“b”,“c”,“a”、“b”、“c”、“a”和“b”].unique());//=>[“a”、“b”、“c”]

您可以同时使用内置函数Array.prototype.filter()和Array.prototype.indexOf()

array.filter((x,y)=>array.indexOf(x)==y)

var arr=[1,2,3,3,4,5,5,6,7,8,9,6,9];var newarr=arr.filter((x,y)=>arr.indexOf(x)==y);console.log(newarr);

有时我需要从对象数组中获取唯一的引用。Lodash似乎是一个很好的助手,但我不认为过滤数组就可以为项目添加依赖项。

让我们假设在比较一个属性(例如id)时两个对象的姿势。

常量a=〔{id:3},{id:4}、{id:30}和{id:5}〕;

既然我们都喜欢一行代码片段,下面是如何做到这一点:

a.reduce((acc,curr)=>acc.find(e=>e.id==curr.id)?acc:[…acc,curr],[])