Javascript过滤器很慢

Son*_*oor 3 javascript arrays node.js

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

var styles = [{itemID:..., styleID:..., styleNum:..., otherFields...}]; // 42455 items
var products = [{productID:..., styleNum:..., otherFields...}]; // 72K items
Run Code Online (Sandbox Code Playgroud)

我需要遍历产品并从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; 
}
Run Code Online (Sandbox Code Playgroud)

...

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;
}
Run Code Online (Sandbox Code Playgroud)

这非常慢,从我的产品阵列迭代100多个项目需要1秒钟.我尝试使用asyc.each,但获得相同的响应时间.当我删除过滤功能时,它的点亮速度很快.有什么方法可以改善我的过滤功能吗?

Jua*_*des 6

为避免每次扫描数组O(n2),您可以创建一个键入的地图styleNum.

var styleNumMap = Object.create(null);
styles.forEach(function(style) {
    if (!styleNumMap[style.styleNum]) {
        styleNumMap[style.styleNum] = [];
    }
    styleNumMap[style.styleNum].push(style);
});
Run Code Online (Sandbox Code Playgroud)

然后就可以了

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; 
}
Run Code Online (Sandbox Code Playgroud)