dop*_*ode 3 javascript arrays filter
我需要对非常大(超过200k个元素)的对象数组执行2个过滤器,因此我希望我的代码在javascript中尽可能快。
第一个过滤器很简单,因为我只需要删除为空(null)的元素:
let validArr = originalArr.filter(el => { return el != null });
Run Code Online (Sandbox Code Playgroud)
第二个过滤器是检查是否validArr[i].name
等于其他数组的元素之一。目前我是这样的:
for(let i = 0, l = validArr.length; i < l; i++) {
if (findInArray(validArr[i].name, otherArr)) {
finalArr.push({
name: validNpc[i].nick,
id: validNpc[i].id
});
}
}
const findInArray = (val, arr) => {
for(let i = 0, l = arr.length; i < l; i++) {
if(arr[i] === val) return true;
}
return false;
};
Run Code Online (Sandbox Code Playgroud)
在循环中,我有微优化,但是有O(n ^ 2)我想重构,但我不知道如何。
将otherArr变成一个Set,然后查找需要O(1),整个循环是O(n):
const names = new Set(otherArr);
const result = validArr
.filter(it => names.has(it.name))
.map(({ nick, id }) => ({ name: nick, id }));
Run Code Online (Sandbox Code Playgroud)