Javascript 比较每个性能问题的阵列

Javascript 比较每个性能问题的阵列,javascript,arrays,foreach,Javascript,Arrays,Foreach,我有两个数组,其中一个数组的对象数组如下,一个数组的记录超过10k,另一个数组的记录少于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:"sus

我有两个数组,其中一个数组的对象数组如下,一个数组的记录超过10k,另一个数组的记录少于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] 
我想在bigArray的索引中找到smallArray中的对象所在的位置,并将其添加到另一个数组中,比如我在下面尝试的indexArray

let indexArray = []; 
bigArray.forEach((element, i) => {
  smallArray.forEach(ele => {
    if (element.name == ele.name && element.id == ele.id) {
      indexArray.push(i); return;
    } 
  }); 
}); 
但这需要时间。最快的方法是什么?

您可以将
O(N^2)
方法简化为
O(N)
方法,方法是将
bigArray
简化为由
名称和
id
组成的键索引的对象。将
名称
id
连接到一个不包含在其中的字符,例如
\uu

const indexArray = [];
const bigArrayIndiciesByNameAndId = bigArray.reduce((a, { name, id }, i) => {
  a[name + '_' + id] = i;
  return a;
}, {});

smallArray.forEach(ele => {
  const keyToFind = ele.name + '_' + ele.id;
  const foundIndex = bigArrayIndiciesByNameAndId[keyToFind];
  if (foundIndex) {
    indexArray.push(foundIndex);
  }
});

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

const getKey=({id,name})=>[id,name].join(“|”);
让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,名称:“sushama”},{id:3,名称:“Sushant”}],
map=newmap(bigArray.map((o,i)=>[getKey(o,i]))
indexArray=smallArray.map((o)=>map.get(getKey(o));

控制台日志(indexArray)
返回
不会“中断”forEach
循环。无法停止forEach的
forEach
。每个项目都将调用
forEach
回调函数一次。找到元素后,继续运行
forEach
循环会浪费资源

您应该将
用于

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
        }
    }
});
let indexArray=[];
bigArray.forEach((元素,i)=>{
对于(var ii=0;ii

提示:代码中总是有一个好的缩进。实际上,您的代码在第一眼看到代码块时,缩进非常糟糕。我在这个示例中修复了它。

请给出一个示例输出,不清楚您想要实现什么。在
bigArray
中是否有多个具有相同
id
name
的条目?
?不,它不会有酷酷的伙伴,我将尝试它跳转目标不能跨函数错误。这就是为什么我试着回去