如何在JavaScript中按category属性值将对象数组分组为指定结构
JavaScript对象数组按分类聚合实现
现有如下JavaScript对象数组:
const data = [ {code: 1, name: "Send OSMI SMS 1", category: "OSMI"}, {code: 2, name: "Send OSMI SMS 2", category: "OSMI"}, {code: 3, name: "Send OSMI SMS 3", category: "OSMI"}, {code: 4, name: "Send OSMI Email 1", category: "OSMI"}, {code: 5, name: "Send OSMI Email 2", category: "OSMI"}, {code: 6, name: "Send OSMI Email 3", category: "OSMI"}, {code: 12, name: "Send advices for cleaning 3.0 Email 1", category: "Advice"}, {code: 13, name: "Send advices for cleaning 2.4 Email 1", category: "Advice"}, {code: 14, name: "Send advices for cleaning 3M Email 1", category: "Advice"}, {code: 15, name: "Send advices for cleaning 3.0 Email 1", category: "Advice"}, {code: 16, name: "Send advices for cleaning 2.4 Email 1", category: "Advice"}, {code: 17, name: "Send advices for cleaning 3М Email 1", category: "Advice"}, {code: 18, name: "Send advices for cleaning 3.0 Email 2", category: "Advice"}, {code: 19, name: "Send advices for cleaning 3.0 Email 3", category: "Advice"}, {code: 20, name: "Emergency VC-1", category: null}, {code: 21, name: "Test", category: null}, {code: 22, name: "Telegram test", category: null} ]
转换要求
将该数组转换为新结构:以原数组的category属性值为新对象的键,对应分类下所有项的name属性组成的数组为值,预期输出如下:
[ {"OSMI" : ["Send OSMI SMS 1", "Send OSMI SMS 2", "Send OSMI SMS 3" ...]}, {"Advice" : ["Send advices for cleaning 2.4 Email 1", ...]}, {null : ["Emergency VC-1", "Test", "Telegram test"]}, ]
最优实现方案
使用reduce()方法遍历数组即可完成聚合,代码如下:
const result = data.reduce(function (acc, item) { acc[item.category] = acc[item.category] || []; acc[item.category].push(item.name); return acc; }, Object.create(null)); console.log(result);
注:上述代码输出的是单个聚合对象,如果需要得到示例中「每个分类单独作为一个对象放在数组内」的格式,可追加如下处理代码:
const formattedResult = Object.entries(result).map(([key, value]) => ({[key]: value})) console.log(formattedResult)
内容的提问来源于stack exchange,提问作者hideo
相关产品推荐
相关产品推荐

