如何直接从原数组生成按周聚合的指定结构新数组?
问题描述
我有如下数组:
var firstjson = [ { "Week" : "Week 1", "Product" : "Apple", "Buy" : "24", "Sell" : "20", "Profit" : "100", "Lost" : "20" }, { "Week" : "Week 1", "Product" : "Egg", "Buy" : "24", "Sell" : "20", "Profit" : "100", "Lost" : "20" }, { "Week" : "Week 2", "Product" : "Apple", "Buy" : "44", "Sell" : "10", "Profit" : "10", "Lost" : "200" }, { "Week" : "Week 2", "Product" : "Milk", "Buy" : "24", "Sell" : "20", "Profit" : "100", "Lost" : "20" } ]
希望将其转换为如下结构的数组:
var finalarray = [ { "Week" : "Week 1", "Apple_Buy" : "24", "Apple_Sell" : "20", "Apple_Profit" : "100", "Apple_Lost" : "20", "Egg_Buy" : "24", "Egg_Sell" : "20", "Egg_Profit" : "100", "Egg_Lost" : "20" }, { "Week" : "Week 2", "Apple_Buy" : "44", "Apple_Sell" : "10", "Apple_Profit" : "10", "Apple_Lost" : "200", "Milk_Buy" : "24", "Milk_Sell" : "20", "Milk_Profit" : "100", "Milk_Lost" : "20" }, ]
我尝试过先提取周列表再循环的方法,但后续无法继续推进,想请教是否有无需提取周列表,直接遍历原数组生成目标数组的简洁实现方式?
解决方案
可以使用JavaScript的reduce方法直接遍历原数组,通过一个对象按Week分组,最后将分组结果转为数组即可,无需提前提取周列表:
const finalarray = Object.values(firstjson.reduce((acc, item) => { // 以Week作为分组的标识key const weekKey = item.Week; // 若当前周未在累加器中,初始化基础对象 if (!acc[weekKey]) { acc[weekKey] = { Week: weekKey }; } // 解构出不需要拼接的字段,遍历剩余字段进行格式转换 const { Week, Product, ...rest } = item; for (const [key, value] of Object.entries(rest)) { acc[weekKey][`${Product}_${key}`] = value; } return acc; }, {})); console.log(finalarray);
代码说明
reduce遍历原数组,用累加器对象acc按Week值分组存储数据- 每个元素处理时,先判断当前Week是否已存在,不存在则初始化包含Week字段的对象
- 解构拆分出Week、Product和其余业务字段,将业务字段以
产品名_字段名的格式作为新键,添加到对应Week的对象中 - 最后通过
Object.values将累加器的对象值转为目标数组格式
内容的提问来源于stack exchange,提问作者kanishka kumarasiri
相关产品推荐
相关产品推荐

