我需要对一个非常大(超过200k元素)的对象数组执行两个过滤操作,因此我希望我的javascript代码速度尽可能快。
第一个过滤器很简单,因为我只需要删除空元素(null):
let validArr = originalArr.filter(el => { return el != null });
第二个过滤器是检查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;
};
在循环中我进行了微小的优化,但存在O(n^2)的问题,我想对其进行重构,但不知道如何做。
validArr
中的“name”属性值到底是什么?如果它们是字符串,您可以将otherArr
转换为一个简单对象,其中“name”值作为属性名称,像true
或1
这样的值作为属性值。然后您只需进行一个简单的属性查找即可。 - PointySet
。 - melpomene.filter(el => { return el != null })
可以简化为.filter(el => !!el)
。 - Jeremy Thille