数组过滤器-摆脱O(n ^ 2)

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)我想重构,但我不知道如何。

Jon*_*lms 6

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