我正在寻找一种有效的方法,从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的方法来做到这一点没有循环和剪接?


当前回答

这已经很晚了,但添加这个来解释@mojtaba roohi的回答。第一个代码块将不起作用,因为每个数组都有不同的对象,即df[0] != nfl[2]。这两个对象看起来相似,但完全不同,当我们使用像数字这样的基本类型时,情况就不是这样了。

let df = [{'name': 'C'},{'name': 'D'}] 让nfl =[{'名字':' A '},{'名字':' B '},{'名字':' C '},{'名字':' D '}) Let res = nfl。filter(x => df.indexOf(x)<0) console.log (res)

下面是工作代码:

let df = [{'name': 'C'},{'name': 'D'}] 让nfl =[{'名字':' A '},{'名字':' B '},{'名字':' C '},{'名字':' D '}); 让res = nfl.filter ((o1群)= > ! df.some ((o2) = > o1.name = = = o2.name)); console.log (res)

其他回答

最简单的方法如何:

var myArray = [a, b, c, d, e, f, g的); var toRemove = ['b', 'c', 'g']; var myArray = myArray.filter((item) => ! console.log (myArray)

这已经很晚了,但添加这个来解释@mojtaba roohi的回答。第一个代码块将不起作用,因为每个数组都有不同的对象,即df[0] != nfl[2]。这两个对象看起来相似,但完全不同,当我们使用像数字这样的基本类型时,情况就不是这样了。

let df = [{'name': 'C'},{'name': 'D'}] 让nfl =[{'名字':' A '},{'名字':' B '},{'名字':' C '},{'名字':' D '}) Let res = nfl。filter(x => df.indexOf(x)<0) console.log (res)

下面是工作代码:

let df = [{'name': 'C'},{'name': 'D'}] 让nfl =[{'名字':' A '},{'名字':' B '},{'名字':' C '},{'名字':' D '}); 让res = nfl.filter ((o1群)= > ! df.some ((o2) = > o1.name = = = o2.name)); console.log (res)

我只是实现为:

Array.prototype.exclude = function(list){
        return this.filter(function(el){return list.indexOf(el)<0;})
}

使用:

myArray.exclude(toRemove);

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

const myArray = [a, b, c, d, e, f, g的); const toRemove = new Set(['b', 'c', 'g']); const difference = myArray。toRemove.has(x)); console.log(差异);// ["a", "d", "e", "f"]

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

高性能和不可变的解决方案

Javascript

const excludeFromArr = (arr, exclude) => {
  const excludeMap = exclude.reduce((all, item) => ({ ...all, [item]: true }), {});
  return arr.filter((item) => !excludeMap?.[item]);
};

打字稿:

const excludeFromArr = (arr: string[], exclude: string[]): string[] => {
  const excludeMap = exclude.reduce<Record<string, boolean>>((all, item) => ({ ...all, [item]: true }), {});
  return arr.filter((item) => !excludeMap?.[item]);
};