数组与每个性能问题进行比较

时间:2019-05-03 09:30:24

标签: javascript arrays foreach

我有两个带有对象数组的数组,如下所示,一个数组将具有1万条以上的记录,而另一个数组将具有100条以下的记录

let bigArray = [{id:1, name:"Raj", level:0}, {id:2, name:"sushama", level:2}, {id:3, name:"Sushant", level:0}, {id:4, name:"Bhaskar", level:2},....upto 30k records] 

let smallArray = [{id:2, name:"sushama"}, {id:3, name:"Sushant"}....upto 100 records] 

我想找到smallArray对象所在的bigArray索引所在的位置,并添加到另一个数组,例如我在下面尝试过的indexArray

let indexArray = []; 
bigArray.forEach((element, i) => {
  smallArray.forEach(ele => {
    if (element.name == ele.name && element.id == ele.id) {
      indexArray.push(i); return;
    } 
  }); 
}); 

但是需要时间。最快的方法是什么?

3 个答案:

答案 0 :(得分:4)

通过将pageChange = currentPage => { const newState = Immutable.merge(this.state, { page: currentPage }, { deep: true }); this.setState(newState); console.log(this.state); // the page property remains the same console.log(newState); // the page property has the new value, the currentPage this.openPreview(); } 简化为由O(N^2)和{{1}组成的键索引的对象,可以将O(N)方法转换为bigArray方法}。通过nameid中没有的字符将nameid连接起来:

_

答案 1 :(得分:2)

您可以使用Map并映射找到的索引。

const getKey = ({ id, name }) => [id, name].join('|');

let bigArray = [{ id: 1, name: "Raj", level: 0 }, { id: 2, name: "sushama", level: 2 }, { id: 3, name: "Sushant", level: 0 }, { id: 4, name: "Bhaskar", level: 2 }],
    smallArray = [{ id: 2, name: "sushama" }, { id: 3, name: "Sushant" }],
    map = new Map(bigArray.map((o, i) => [getKey(o), i]))
    indexArray = smallArray.map((o) => map.get(getKey(o)));

console.log(indexArray);

答案 2 :(得分:2)

return不会“破坏” forEach循环。 forEach无法停止。 forEach回调函数每次总是被调用一次。找到元素后,继续运行forEach循环会浪费资源。

您应该改用for

let indexArray = []; 
bigArray.forEach((element, i) => {
    for (var ii = 0; ii < smallArray.length; ii++) {
        var ele = smallArray[ii];
        if (element.name == ele.name && element.id == ele.id) {
            indexArray.push(i);
            break; // This will break the "for" loop as we found the item
        }
    }
});

提示:在代码中始终要有良好的缩进。实际上,您的代码很难一眼就能识别代码块。我在此示例中对其进行了修复。