Javascript过滤器很慢

时间:2016-06-20 16:27:22

标签: javascript arrays node.js

我的节点应用程序中有两个大型数组。

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,但获得相同的响应时间。 当我删除过滤功能时,它的点亮速度很快。有什么方法可以改善我的过滤功能吗?

1 个答案:

答案 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; 
}
相关问题