如果数组存在于另一个多维数组中,如何从多维数组中删除它?

时间:2014-10-29 16:07:17

标签: javascript arrays

我有两个多维数组,需要从数组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中的元素是单个值但是它们是数组时,这是有效的。不确定我做错了什么?

3 个答案:

答案 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;
        }
    }
}

小提琴:http://jsfiddle.net/o2qk7hjd/

答案 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)

Demo

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))

Demo 2