我正在寻找一种有效的方法,从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的方法来做到这一点没有循环和剪接?
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)。
如果您正在使用对象数组。然后,下面的代码将发挥神奇的作用,其中对象属性将作为删除重复项的标准。
在下面的示例中,比较每个项目的名称,已删除重复项。
试试这个例子。http://jsfiddle.net/deepak7641/zLj133rh/
var myArray = [
{name: 'deepak', place: 'bangalore'},
{name: 'chirag', place: 'bangalore'},
{name: 'alok', place: 'berhampur'},
{name: 'chandan', place: 'mumbai'}
];
var toRemove = [
{name: 'deepak', place: 'bangalore'},
{name: 'alok', place: 'berhampur'}
];
for( var i=myArray.length - 1; i>=0; i--){
for( var j=0; j<toRemove.length; j++){
if(myArray[i] && (myArray[i].name === toRemove[j].name)){
myArray.splice(i, 1);
}
}
}
alert(JSON.stringify(myArray));
//Using the new ES6 Syntax
console.log(["a", "b", "c", "d", "e", "f", "g"].filter(el => !["b", "c", "g"].includes(el)));
// OR
// Main array
let myArray = ["a", "b", "c", "d", "e", "f", "g"];
// Array to remove
const toRemove = ["b", "c", "g"];
const diff = () => (myArray = myArray.filter((el) => !toRemove.includes(el)));
console.log(diff()); // [ 'a', 'd', 'e', 'f' ]
// OR
const diff2 = () => {
return myArray = myArray.filter((el) => !toRemove.includes(el));
};
console.log(diff2()); // [ 'a', 'd', 'e', 'f' ]