我有两个带有对象数组的数组,如下所示,一个数组将具有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;
}
});
});
但是需要时间。最快的方法是什么?
答案 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
方法}。通过name
和id
中没有的字符将name
和id
连接起来:
_
答案 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
}
}
});
提示:在代码中始终要有良好的缩进。实际上,您的代码很难一眼就能识别代码块。我在此示例中对其进行了修复。