# 题目要求
给定一个数组,内部要多个结构相同的Object
类型的数组元素。要求type
相同的value
值都合并在一起。
# 合并前
// Before
const list = [{ type: 'a', value: 1 }, { type: 'b', value: 2 }, { type: 'a', value: 3 }, { type: 'b', value: 4 }];
# 合并后
// After
const list = [{ type: 'a', value: 4 }, { type: 'b', value: 6 }];
# 初步解法
- 通过
Array.prototype.reduce
迭代,返回每个值得映射,如Map => [['a',4']]
。 - 用
...
扩展运算符将Map
类型转化为数组Array
类型。 - 再用
Array.prototype.map
迭代,每个子项返回固定结构的对象,对应的数组元素赋值。
/// 我写的代码
function concatListData(data) {
return [...data.reduce((pre, cur) => {
!pre.has(cur.type) ? pre.set(cur.type, cur.value) : pre.set(cur.type, pre.get(cur.type) + cur.value);
return pre;
}, new Map())].map(item => ({ type: item[0], value: item[1] }))
}
# 解法优化
reduce
方法采用默认返回一个对象,扩展前一个数据pre
,并在后面添加同名属性进行覆盖更新数据。- 添加字面量增强写法
[type]:value
reduce
得到的是一个对象{a:4,b:6}
,Object.entries
去迭代它- 通过解构
map
中的第一参数,以及返回对象中的 默认属性赋值 , 简化代码的同时保证可读性。
const myF = arr => Object.entries(arr.reduce((pre, { type, value }) => ({...pre,[type]: value + pre[type] ?? 0}), {})).map(([type, value]) => ({ type, value }));