删除另一个数组中包含的所有元素

2022-08-29 23:35:59

我正在寻找一种有效的方法来从javascript数组中删除所有元素,如果它们存在于另一个数组中。

// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

// and this one:
var toRemove = ['b', 'c', 'g'];

我想在 myArray 上进行操作,使其保持此状态:['a', 'd', 'e', 'f']

使用jQuery,我使用的是 和 ,它运行良好:grep()inArray()

myArray = $.grep(myArray, function(value) {
    return $.inArray(value, toRemove) < 0;
});

有没有一种纯粹的javascript方法可以在不循环和拼接的情况下做到这一点?


答案 1

使用 Array.filter() 方法:

myArray = myArray.filter( function( el ) {
  return toRemove.indexOf( el ) < 0;
} );

小幅改进,因为浏览器对 Array.include() 的支持有所增加:

myArray = myArray.filter( function( el ) {
  return !toRemove.includes( el );
} );

使用箭头函数进行下一步调整:

myArray = myArray.filter( ( el ) => !toRemove.includes( el ) );

答案 2

ECMAScript 6 集可以允许更快地计算一个数组中不在另一个数组中的元素:

const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
const toRemove = new Set(['b', 'c', 'g']);

const difference = myArray.filter( x => !toRemove.has(x) );

console.log(difference); // ["a", "d", "e", "f"]

由于现在浏览器使用的V8引擎的查找复杂度是O(1),所以整个算法的时间复杂度是O(n)。