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


当前回答

使用Array.filter()方法:

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

小小的改进,因为浏览器对Array.includes()的支持增加了:

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

下一个使用箭头函数的调整:

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

其他回答

使用Array.filter()方法:

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

小小的改进,因为浏览器对Array.includes()的支持增加了:

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

下一个使用箭头函数的调整:

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

最简单的方法如何:

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

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)。

你可以使用_。by和lodash的区别

const myArray = [
  {name: 'deepak', place: 'bangalore'}, 
  {name: 'chirag', place: 'bangalore'}, 
  {name: 'alok', place: 'berhampur'}, 
  {name: 'chandan', place: 'mumbai'}
];
const toRemove = [
  {name: 'deepak', place: 'bangalore'},
  {name: 'alok', place: 'berhampur'}
];
const sorted = _.differenceBy(myArray, toRemove, 'name');

示例代码:CodePen

现在是一行代码:

Console.log (['a', 'b', 'c', 'd', 'e', 'f', 'g']。filter(x => !~['b', 'c', 'g'].indexOf(x)))

可能无法在旧浏览器上运行。