JS遍历数组按taxonomy分组聚合id生成新数组的最优实现方案
数组分组实现方案
原有代码问题梳理
- 原对象的主键为
id,你的代码中错误解构了不存在的value字段,无法获取正确的id值 - 对过滤后的数组执行map操作时,为每个元素单独生成了包含taxonomy和单个id的对象,最后将整个数组push到
newArray,导致最终结果为二维数组,且ids字段为单个数值而非数组 - 实现逻辑中多次遍历数组(提取taxonomy遍历一次,去重后遍历每个唯一taxonomy时又对原数组做filter和map,整体时间复杂度为O(n*m)),效率较低
优化实现方案
使用reduce一次遍历完成分组,再转为目标格式,时间复杂度为O(n),仅需遍历原数组一次:
// 第一步:按taxonomy分组,生成 {taxonomy值: id数组} 的映射对象 const groupMap = terms.reduce((result, item) => { const { taxonomy, id } = item // 不存在对应taxonomy分组时初始化空数组 if (!result[taxonomy]) { result[taxonomy] = [] } // 将当前id加入对应分组 result[taxonomy].push(id) return result }, {}) // 第二步:将映射对象转换为目标数组结构 const newArray = Object.entries(groupMap).map(([taxonomy, ids]) => ({ taxonomy, ids }))
执行上述代码后得到的newArray完全符合你需要的结构。
内容的提问来源于stack exchange,提问作者CyberJ
相关产品推荐
相关产品推荐

