从索引0开始删除二维数组中的重复值

时间:2017-09-07 15:19:07

标签: javascript arrays

哪种方法可以从二维数组中删除重复值?例如,我的数组如下所示:

var bid_array = [[1,2,3,4,5],[3,4,6,7,8,2],[7,2,4,9,11,15],[10,12,3,7,11]];

我需要开始评估bid_array[0]并检查bid_array[1]bid_array[2]bid_array[3]是否包含bid_array[0]中已存在的值(如果存在)删除从冲突数组中复制的值,当我们完成检查最后一个数组时,现在从第二个索引位置(bid_array[1])开始,然后再继续检查下一个子数组。

我正在尝试这个,但只有在最多只有1个值重复两次时才有效。例如:

for (var i = 0; i < 8; i++) {
  for (var j = 0; j < bid_array.length; j++) {
    for (var k = (j + i); k < bid_array.length; k++) {
      for (var l = 0; l < bid_array[k].length; l++) {
        if (bid_array[j].indexOf(bid_array[k][l]) > -1) {
          bid_array[k].splice(l, 1);
        }
      }
    }
  }
}

我想要之前的原始数组:

var bid_array = [[1,2,3,4,5],[3,4,6,7,8,2],[7,2,4,9,11,15],[10,12,3,7,11]];

在删除所有重复的值并保留一个之后:

var bid_array = [[1,2,3,4,5],[6,7,8],[9,11,15],[10,12]];

这样做的最佳方法是什么,只要保留一个,所有重复值都被删除的安全性?谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

你可以通过以下方式完成

var bid_array = [[1,2,3,4,5],[3,4,6,7,8,2],[7,2,4,9,11,15],[10,12,3,7,11]];

let map = {};
bid_array = bid_array.map(function(element){
    return element.filter(function(val){
        if(map[val])
          return 0;
        map[val] = 1;
        return 1;
    });
})

console.log(bid_array);

答案 1 :(得分:1)

您可以使用哈希表和支票。

&#13;
&#13;
function unique(array) {
    var hash = Object.create(null);
    return array.map(function (a) {
        return a.filter(function (b) {
            return !hash[b] && (hash[b] = true);
        });
    });
}

var array = [[1, 2, 3, 4, 5], [3, 4, 6, 7, 8, 2], [7, 2, 4, 9, 11, 15], [10, 12, 3, 7, 11]];

console.log(unique(array));
&#13;
&#13;
&#13;

ES5与Set

&#13;
&#13;
function unique(array) {
    var hash = new Set;
    return array.map(a => a.filter(b => !hash.has(b) && hash.add(b)));
}

var array = [[1, 2, 3, 4, 5], [3, 4, 6, 7, 8, 2], [7, 2, 4, 9, 11, 15], [10, 12, 3, 7, 11]];

console.log(unique(array));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

一个完美的Set用例:

var set = new Set();
for(const array of bid_array){
 var c = 0;
 array.slice().forEach((el,i) => {
   if(set.has(el)){
      array.splice(i-(c++),1);
   }else{
       set.add(el);
   }
  }); 
 }