我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在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数组中删除重复值

类似的问题:

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


当前回答

在其他答案的基础上,这里有另一个变体,它使用可选标志来选择策略(保持第一次出现或保持最后一次出现):

不扩展Array.prototype

function unique(arr, keepLast) {
  return arr.filter(function (value, index, array) {
    return keepLast ? array.indexOf(value, index + 1) < 0 : array.indexOf(value) === index;
  });
};

// Usage
unique(['a', 1, 2, '1', 1, 3, 2, 6]); // -> ['a', 1, 2, '1', 3, 6]
unique(['a', 1, 2, '1', 1, 3, 2, 6], true); // -> ['a', '1', 1, 3, 2, 6]

扩展Array.prototype

Array.prototype.unique = function (keepLast) {
  return this.filter(function (value, index, array) {
    return keepLast ? array.indexOf(value, index + 1) < 0 : array.indexOf(value) === index;
  });
};

// Usage
['a', 1, 2, '1', 1, 3, 2, 6].unique(); // -> ['a', 1, 2, '1', 3, 6]
['a', 1, 2, '1', 1, 3, 2, 6].unique(true); // -> ['a', '1', 1, 3, 2, 6]

其他回答

var myArray=[“a”,2,“a”、2,“b”,“1”];常量=[];myArray.forEach((t)=>!uniques.includes(t)和uniques.push(t));console.log(uniques);

奇怪的是,这以前没有人提出过。。要按数组中的对象键(下面的id)删除重复项,可以执行以下操作:

const uniqArray = array.filter((obj, idx, arr) => (
  arr.findIndex((o) => o.id === obj.id) === idx
)) 
Array.prototype.getUnique = function() {
    var o = {}, a = []
    for (var i = 0; i < this.length; i++) o[this[i]] = 1
    for (var e in o) a.push(e)
    return a
}

使用字段[2]作为Id,创建唯一数组数组:

常量arr=[['497','Q0','WTX091-B06-138','0','1.000000','GROUP001'],['497','Q0','WTX091-B09-92','1','0.866899288','GROUP001'],['497','Q0','WTX091-B09-92','2','0.846036819','GROUP001'],['497','Q0','WTX091-B09-57','3','0.835025326','GROUP001'],['497','Q0','WTX091-B43-79','4','0.765068215','GROUP001'],['497','Q0','WTX091-B43-56','5','0.764211464','GROUP001'],['497','Q0','WTX091-B44-448','6','0.761701704','GROUP001'],['497','Q0','WTX091-B44-12','7','0.761701704','GROUP001'],['497','Q0','WTX091-B49-128','8','0.747434800','GROUP001'],['497','Q0','WTX091-B18-17','9','0.746724770','GROUP001'],['497','Q0','WTX091-B19-374','10','0.733379549','GROUP001'],['497','Q0','WTX091-B19-344','11','0.731421782','GROUP001'],['497','Q0','WTX091-B09-92','12','0.726450470','GROUP001'],['497','Q0','WTX091-B19-174','13','0.712757036','GROUP001']];arr.filter((val1,idx1,arr)=>~val1.indexOf(val1[2])&&!(arr.filter((val2,idx2)=>~val2.indexOf(val1[2])&&idx2<idx1).长度));控制台日志(arr);

还有另一个答案,只是因为我为我的特定用例写了一个答案。我碰巧正在对阵列进行排序,如果我正在排序,我可以使用它来消除重复数据。

注意,我的排序处理我的特定数据类型,您可能需要不同的排序,这取决于您拥有的元素类型。

var sortAndDedup = function(array) {
  array.sort(function(a,b){
    if(isNaN(a) && isNaN(b)) { return a > b ? 1 : (a < b ? -1 : 0); }
    if(isNaN(a)) { return 1; }
    if(isNaN(b)) { return -1; }
    return a-b;
  });

  var newArray = [];
  var len = array.length;
  for(var i=0; i<len; i++){
    if(i === 0 || array[i] != array[i-1]){
      newArray.push(array[i]);
    }
  }
};