我正在寻找一种有效的方法,从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)。
高性能和不可变的解决方案
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]);
};
我没有使用任何内置方法构建逻辑,请让我知道任何优化或修改。
我在JS编辑器中测试了,它工作得很好。
var myArray = [
{name: 'deepak', place: 'bangalore'},
{name: 'alok', place: 'berhampur'},
{name: 'chirag', place: 'bangalore'},
{name: 'chandan', place: 'mumbai'},
];
var toRemove = [
{name: 'chirag', place: 'bangalore'},
{name: 'deepak', place: 'bangalore'},
/*{name: 'chandan', place: 'mumbai'},*/
/*{name: 'alok', place: 'berhampur'},*/
];
var tempArr = [];
for( var i=0 ; i < myArray.length; i++){
for( var j=0; j<toRemove.length; j++){
var toRemoveObj = toRemove[j];
if(myArray[i] && (myArray[i].name === toRemove[j].name)) {
break;
}else if(myArray[i] && (myArray[i].name !== toRemove[j].name)){
var fnd = isExists(tempArr,myArray[i]);
if(!fnd){
var idx = getIdex(toRemove,myArray[i])
if (idx === -1){
tempArr.push(myArray[i]);
}
}
}
}
}
function isExists(source,item){
var isFound = false;
for( var i=0 ; i < source.length; i++){
var obj = source[i];
if(item && obj && obj.name === item.name){
isFound = true;
break;
}
}
return isFound;
}
function getIdex(toRemove,item){
var idex = -1;
for( var i=0 ; i < toRemove.length; i++){
var rObj =toRemove[i];
if(rObj && item && rObj.name === item.name){
idex=i;
break;
}
}
return idex;
}
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)。