【发布时间】:2022-01-02 22:10:59
【问题描述】:
我正在尝试针对较小的 (2K) 数组过滤较大的数组 (10K) 记录。
使用此代码大约需要 5 秒才能完成。
let inventory = []
allItems.forEach((item) => {
localOrders.forEach((order) => {
if (item.id === Number(order.itemId)) {
inventory.push({
item,
order,
type: 'local',
})
}
})
onlineOrders.forEach((order) => {
if (item.id === Number(order.itemId)) {
inventory.push({
item,
order,
type: 'online',
})
}
})
})
return inventory
我使用 forEach 而不是 filter(在 90 毫秒时要快得多)的原因是我在同一个 (10K) 数组中寻找两个不同的项目。即使我使用了过滤器,我仍然需要将主数组和辅助数组中的数据附加到包含它们所有数据的最终对象。
我最好的选择是什么来优化它,让它不会那么慢,但满足我对包含项目详细信息和订单详细信息的最终数组的要求?
【问题讨论】:
-
假设
id是唯一的,您当然可以添加break。 -
您应该将您的
localOrders和onlineOrders转换为Maps 或objects,使用ID 作为键,这样查找平均变成O(1)。这将使您的代码只执行k*10000操作而不是k*5000*10000。 -
如果
id是唯一的,使用break,或者你应该使用Map而不是数组,如果allItems或localOrders, onlineOrders是排序的,那么使用二分查找, -
@JavaScript 我将它转换为 for of 循环,因为 foreach 不支持 break 并且从 4300 毫秒到大约 4100 毫秒。这是一个进步,但仍然很慢。
标签: javascript performance loops foreach