Javascript 从一个多维数组中删除另一个多维数组中的元素

Javascript 从一个多维数组中删除另一个多维数组中的元素,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,我发现很难理解我认为是一项非常简单的任务。我现在脑子里乱七八糟的,我还有一个最后期限( 我需要从一个多维数组中获取所有元素数组,然后从另一个多维数组中删除它们 Arr1 = [["Tom", "161"], ["Dick", "29"], ["Harry", "46"], ["Mike", "72"], ["Sally", "11"]]; Arr2 = [["Harry", "46"], ["Mike", "72"], ["Tom", "161"]]; 因此,在本例中,我希望从Arr2中获取

我发现很难理解我认为是一项非常简单的任务。我现在脑子里乱七八糟的,我还有一个最后期限(

我需要从一个多维数组中获取所有元素数组,然后从另一个多维数组中删除它们

Arr1 = [["Tom", "161"], ["Dick", "29"], ["Harry", "46"], ["Mike", "72"], ["Sally", "11"]];

Arr2 = [["Harry", "46"], ["Mike", "72"], ["Tom", "161"]];
因此,在本例中,我希望从Arr2中获取所有元素数组,并将它们从Arr1中删除,这样之后的Arr1将如下所示:

Arr1 = [["Dick", "29"], ["Sally", "11"]];
function(array1, array2) {
    var seen = {};
    var returnedArray = [];

    for(var i = 0; i < array2.length; i++) {
        var elements = array2[i];
        seen[elements[0] + elements[1]] = true;

        //an alternative to the above is to do
        //seen[JSON.stringify(elements)] = true;
    }

    for(var i = 0; i < array1.length; i++) {
        var elements = array1[i];
        if(!seen[elements[0] + elements[1]]) {
            returnedArray.push(elements);
        }

        //an alternative to the above is to do
        //if(!seen[JSON.stringify(elements)]) {
        //   ...
        //}
        //
        //if you took the alternate approach in the first loop
    }

    return returnedArray;
}
这有意义吗


EDITx2:等等,不,忽略这一点,我太蠢了。

如果需要快速组合一些东西,那么使用嵌套循环遍历Arr1中每个元素的Arr2元素,并对每个元素进行比较。您可以查看此问题的答案,以获得有关比较内部数组的提示:


假设数组中始终有两个元素,并且“唯一”元素定义为名称和数字的组合,则可以执行以下操作:

Arr1 = [["Dick", "29"], ["Sally", "11"]];
function(array1, array2) {
    var seen = {};
    var returnedArray = [];

    for(var i = 0; i < array2.length; i++) {
        var elements = array2[i];
        seen[elements[0] + elements[1]] = true;

        //an alternative to the above is to do
        //seen[JSON.stringify(elements)] = true;
    }

    for(var i = 0; i < array1.length; i++) {
        var elements = array1[i];
        if(!seen[elements[0] + elements[1]]) {
            returnedArray.push(elements);
        }

        //an alternative to the above is to do
        //if(!seen[JSON.stringify(elements)]) {
        //   ...
        //}
        //
        //if you took the alternate approach in the first loop
    }

    return returnedArray;
}
函数(array1,array2){
var-seen={};
var returnedArray=[];
对于(变量i=0;i
因为它都是字符串,所以你可以通过字符串方法和链接获得创造性。可能不是最好的性能,也有点棘手,但它可以工作:

var arr = [["Tom", "161"], ["Dick", "29"], ["Harry", "46"], ["Mike", "72"], ["Sally", "11"]];
var remove = [["Harry", "46"], ["Mike", "72"], ["Tom", "161"]];

var result = arr
  .join('|')
  .replace(RegExp(remove.join('|'),'g'),'')
  .match(/[^|]+/g)
  .map(function(s){ return s.split(',') });

console.log(result); //=> [["Dick","29"],["Sally","11"]]
您甚至可以尝试使用
JSON
。我不建议在任何情况下将其用于生产,只是为了好玩


演示:

是的,这很有意义。您尝试过什么吗?一般的解决方案是循环检查每一个项目,并检查是否有任何项目匹配……如果匹配,您将使用
.splice()
方法删除项目。虽然它可能会优化为使用查找而不是嵌套循环,但您的方法是我唯一可以使用的方法。谢谢!