如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]
Posted
技术标签:
【中文标题】如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]【英文标题】:How to remove an array from a multidimensional array if it exists in another multidimensional array? [duplicate] 【发布时间】:2014-12-25 10:47:03 【问题描述】:我有两个多维数组,需要从数组 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);
这适用于 arrayA 和 arrayB 中的元素是单个值并且当它们是数组时。不知道我做错了什么?
【问题讨论】:
您确定indexOf
用于数组吗? w3schools.com/jsref/jsref_indexof.asp
【参考方案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】:Array.prototype.indexOf
使用严格的相等比较来检查元素是否相等。这不适用于引用类型,因为[] === [];
为假。您可以使用@tymeJV 解决方案,即O(lenA*lenB)
复杂性或预索引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
如果内部数组中元素的顺序未得到保证,则可以使用排序。这将使这个任务O(lenA*log(lenA) + lenB*log(lenB))
Demo 2.
【讨论】:
【参考方案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/
【讨论】:
谢谢,但不幸的是,订单不保证匹配 我用过这个,真的很有帮助!只是一个侧面说明,请随意使用 === 而不是 ==。 #eslint以上是关于如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章