如何将含category与level的数组转换为分组目标对象?
最优转换方案:数组按分类归并
用Array.prototype.reduce是实现这个转换的最优方法,仅需一次数组遍历(时间复杂度O(n)),代码简洁且逻辑清晰:
基础实现代码
const originalArray = [ { "level": "level3", "category": "car" }, { "level": "level1", "category": "bike" }, { "level": "level2", "category": "car" }, { "level": "level5", "category": "bike" } ]; const result = originalArray.reduce((acc, item) => { // 若当前分类未在累加器中,初始化空数组 if (!acc[item.category]) { acc[item.category] = []; } // 将当前level推入对应分类的数组 acc[item.category].push(item.level); return acc; }, {}); console.log(result); // 输出:{ car: ["level3", "level2"], bike: ["level1", "level5"] }
简化版代码(解构赋值+逻辑或)
可以通过解构赋值直接提取属性,并用逻辑或运算符简化数组初始化步骤,让代码更紧凑:
const result = originalArray.reduce((acc, { category, level }) => { acc[category] = acc[category] || []; acc[category].push(level); return acc; }, {});
原理说明
reduce的核心是用一个累加器(这里是初始空对象{})逐步收集处理结果- 遍历数组每一项时,先判断当前分类是否已存在于累加器中,不存在则创建对应空数组
- 将当前项的
level值推入对应分类的数组,最终返回完整的分组对象
这种方案既保证了性能,又兼顾了代码可读性,是处理这类数组分组问题的标准最优解。
内容的提问来源于stack exchange,提问作者pj013
相关产品推荐
相关产品推荐

