Javascriptfilter很慢

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

var styles = [{itemID:..., styleID:..., styleNum:..., otherFields...}]; // 42455 items var products = [{productID:..., styleNum:..., otherFields...}]; // 72K items 

我需要遍历产品,并从styles数组中获取关联的styleID,并将新项添加到新数组中。 样式数组按styleNumsorting。 这是我所尝试的:

 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,但获得相同的响应时间。 当我删除过滤function,它的照明快。 有没有办法改善我的过滤function?

为了避免每次O(n2)扫描数组,你可以创build一个由styleNum键入的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; }