我有两个多维数组,需要从数组B中存在的数组A中删除所有数组。我已经尝试过这种方式而没有运气:
var arrayA = [[0,1], [2,0], [0,3], [4,0], [0,5]];
var arrayB = [[0,1], [0,3]];
arrayA = arrayA.filter( function( el ) {
return arrayB.indexOf( el ) < 0;
} );
alert(arrayA);
当arrayA和arrayB中的元素是单个值但是它们是数组时,这是有效的。不确定我做错了什么?
答案 0 :(得分:3)
假设内部数组的顺序始终相同:
for (var i = 0; i < arrayA.length; i++) {
for (var j = 0; j < arrayB.length; j++) {
if (JSON.stringify(arrayA[i]) == JSON.stringify(arrayB[j])) {
arrayA.splice(i, 1);
break;
}
}
}
答案 1 :(得分:1)
你可以这样做
var arr = arrayA.map(function(x){ return x + "" }); // convert the array to string
arrayB.forEach(function(e) {
var idx = (arr.indexOf(e + "")); // find the index
arr.splice(idx, 1); // remove it
});
arrayA = arr.map(function(x) { return x.split(","); });
答案 2 :(得分:1)
Array.prototype.indexOf
使用严格等于比较来检查元素是否相等。这不适用于引用类型,因为[] === [];
为false。您可以使用@ O(lenA*lenB)
复杂度的@tymeJV解决方案,也可以使用arrayB
预引导O(lenA + lenB)
function index(arr) {
return arr.reduce(function(acc, item){
return acc[JSON.stringify(item)] = item, acc
}, {});
}
var arrayA = [[0,1], [2,0], [0,3], [4,0], [0,5]];
var arrayB = [[0,1], [0,3]];
var indexB = index(arrayB);
arrayA = arrayA.filter( function( el ) {
return !(JSON.stringify(el) in indexB);
} );
console.log(arrayA);
<强> UPD 强>
如果不保证内部数组中元素的顺序,则可以使用sort。这将使此任务成为O(lenA*log(lenA) + lenB*log(lenB))