如何高效将serialList按articleNumberList关联属性分类?
优化数组分类方案:高效替代嵌套循环与冗余判断
需求回顾
将serialList中的对象,根据其ArticleNumber属性与articleNumberList中Article属性的匹配关系,归入对应分类数组中。
原实现存在两个核心问题:
- 嵌套循环导致时间复杂度为O(n*m),当
serialList数据量增长时性能急剧下降 - 大量
if-else判断造成代码冗余,后续新增分类需重复修改逻辑
优化方案:映射表+单循环遍历
步骤1:构建Article到Model的映射表
先将articleNumberList转换为键值对映射,将匹配查找的时间复杂度从O(m)降到O(1):
// 构建Article -> Model的映射表 const articleMap = articleNumberList.reduce((map, item) => { map[item.Article] = item.Model; return map; }, {});
步骤2:初始化分类容器并遍历分类
用一个对象统一管理所有分类数组,遍历一次serialList即可完成所有分类:
// 初始化所有分类数组(键名对应articleMap中的Model值) const categorizedLists = { client: [], ipad: [], phone: [], switch: [], hardware: [], mac: [], printer: [] }; // 遍历serialList完成分类 serialList.forEach(serialItem => { const targetModel = articleMap[serialItem.ArticleNumber]; // 仅当匹配到有效分类时才添加 if (targetModel && categorizedLists[targetModel]) { categorizedLists[targetModel].push(serialItem); } }); // 按需提取单独的分类数组(可选) const clientList = categorizedLists.client; const ipadList = categorizedLists.ipad; const phoneList = categorizedLists.phone; const switchList = categorizedLists.switch; const hardwareList = categorizedLists.hardware; const macList = categorizedLists.mac; const printerList = categorizedLists.printer;
方案优势
- 时间复杂度降至O(n+m)(n为serialList长度,m为articleNumberList长度),大数据量下性能提升显著
- 无冗余判断逻辑,后续新增分类只需在
categorizedLists中添加对应键值对,无需修改遍历逻辑
备选方案:使用Array.filter()批量生成分类数组
如果分类数量较少,也可以用filter()直接生成各分类数组,但此方法需多次遍历serialList,大数据量下性能不如上述方案:
// 先获取所有有效的Article值,避免匹配无效分类 const validArticles = new Set(articleNumberList.map(item => item.Article)); // 生成各分类数组 const clientList = serialList.filter(item => item.ArticleNumber === 'CLIENT' && validArticles.has(item.ArticleNumber) ); const ipadList = serialList.filter(item => item.ArticleNumber === 'IPAD' && validArticles.has(item.ArticleNumber) ); const phoneList = serialList.filter(item => item.ArticleNumber === 'PHONE' && validArticles.has(item.ArticleNumber) ); // ...其余分类数组以此类推
内容的提问来源于stack exchange,提问作者Vejdis
相关产品推荐
相关产品推荐

