如何从多维数组中删除一个数组,如果它存在于另一个多维数组中?
如何从多维数组中删除一个数组,如果它存在于另一个多维数组中?
此问题已经有了答案:
我有两个多维数组,需要从数组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日
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。
假设内部数组总是按照相同的顺序匹配:
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; } } }