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

28 浏览
0 Comments

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

此问题已经有了答案:

如何比较JavaScript中的数组?

我有两个多维数组,需要从数组A中删除所有存在于数组B中的数组。我已经尝试了以下方法,但没有成功:

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

当数组A和数组B中的元素是单个值时,这种方法有效,但当它们是数组时就不行了。不确定我哪里出错了?

admin 更改状态以发布 2023年5月20日
0
0 Comments

Array.prototype.indexOf使用严格相等比较来检查元素是否相等。这对于引用类型不起作用,因为[] === [];是假的。你可以使用@tymeJV的解决方案,它的复杂度为O(lenA*lenB),或者预处理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);

更新
如果内部数组中元素的顺序不能保证,可以使用排序。这将使得这个任务的复杂度为O(lenA*log(lenA) + lenB*log(lenB))

演示2

0
0 Comments

假设内部数组总是按照相同的顺序匹配:

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/

0