哪种方法可以从二维数组中删除重复值?例如,我的数组如下所示:
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]];
这样做的最佳方法是什么,只要保留一个,所有重复值都被删除的安全性?谢谢你的帮助。
答案 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)
您可以使用哈希表和支票。
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;
ES5与Set
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;
答案 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);
}
});
}