如何不借助第三方库按特定键值分组JavaScript对象数组
按flavor字段分组JavaScript对象数组
我有一组结构无序的JavaScript对象数据,这些对象拥有相同的键,但值可能不同:
const raw_data = { "sweets":[ { "flavor":"chocolate", "product":"icecream", "price":3 }, { "flavor":"vanilla", "product":"icecream", "price":3 }, { "flavor":"chocolate", "product":"candy", "price":1 }, { "flavor":"chocolate", "product":"shake", "price":5 }, { "flavor":"vanilla", "product":"candy", "price":2 }, { "flavor":"strawberry", "product":"icecream", "price":3 } ] }
我希望得到一个新对象,其键为raw_data中对象的flavor字段的唯一值,对应的值为相同flavor的对象组成的数组,示例如下:
const cleaned_data = { "chocolate": [ { "flavor":"chocolate", "product":"icecream", "price":3 }, { "flavor":"chocolate", "product":"candy", "price":1 }, { "flavor":"chocolate", "product":"shake", "price":5 }, ], "vanilla": [ { "flavor":"vanilla", "product":"icecream", "price":3 }, { "flavor":"vanilla", "product":"candy", "price":2 }, ], "strawberry": [ { "flavor":"strawberry", "product":"icecream", "price":3 } ] }
请提供一个不使用第三方库的实现函数。
实现函数
可以使用原生JavaScript的Array.prototype.reduce()方法完成分组,这是处理此类聚合场景的高效方案:
function groupByFlavor(data) { return data.sweets.reduce((acc, item) => { // 初始化当前flavor对应的数组(如果不存在) acc[item.flavor] = acc[item.flavor] || []; // 将当前对象加入对应数组 acc[item.flavor].push(item); return acc; }, {}); } // 调用示例 const cleaned_data = groupByFlavor(raw_data); console.log(cleaned_data);
逻辑说明
reduce遍历:以空对象为初始累加器,逐个遍历sweets数组中的每个对象。- 数组初始化:使用
acc[item.flavor] || []简化判断,若当前flavor未在累加器中,则创建空数组。 - 元素追加:将当前对象推入对应
flavor的数组,最终返回构建好的分组对象。
该实现时间复杂度为O(n),仅依赖原生API,无需任何第三方库。
内容的提问来源于stack exchange,提问作者askingstupidquestions
相关产品推荐
相关产品推荐

