如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]

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

以上是关于如果数组存在于另一个多维数组中,如何从多维数组中删除该数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 中的多维关联数组中删除项目

如何从多维数组中获取维度(切片)

检查多维数组的任何子数组中的特定键是不是存在特定值

将一个数组值与另一个多维数组匹配,然后从多维数组中获取值

使用php从多维数组中获取子数组

如何理解JS多维数组