我的节点应用程序中有两个大型数组。
var styles = [{itemID:..., styleID:..., styleNum:..., otherFields...}]; // 42455 items
var products = [{productID:..., styleNum:..., otherFields...}]; // 72K items
我需要遍历产品并从styles数组中获取关联的styleID,并将新项添加到新数组中。 styles数组按styleNum排序。这是我尝试过的:
var i=0, len = products.length, items = new Array(products.length);
for (i = 0; i < len; i++)
{
var workingItem = products[i];
var styleID = filterStyles(workingItem.styleNum)[0].styleID;
var item = {styleID:..., other fields};
items[i]=item;
}
...
function filterStyles(styleNum)
{
var results = [];
var item;
for (var i = 0, len = createdStyles.length; i < len; i++)
{
item = createdStyles[i];
if (item.styleNum == styleNum) results.push(item);
}
return results;
}
这非常慢,从我的产品阵列迭代100多个项目需要1秒钟。我尝试使用asyc.each,但获得相同的响应时间。 当我删除过滤功能时,它的点亮速度很快。有什么方法可以改善我的过滤功能吗?
答案 0 :(得分:5)
为避免每次O(n2)
扫描数组,您可以创建一个由styleNum
键入的地图。
var styleNumMap = Object.create(null);
styles.forEach(function(style) {
if (!styleNumMap[style.styleNum]) {
styleNumMap[style.styleNum] = [];
}
styleNumMap[style.styleNum].push(style);
});
然后你可以做
var i=0, len = products.length, items = new Array(products.length);
for (i = 0; i < len; i++)
{
var workingItem = products[i];
var styleID = styleNumMap[workingItem.styleNum][0].styleID;
var item = {styleID:..., other fields};
items[i]=item;
}