# 题目要求

给定一个数组,内部要多个结构相同的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 }));

# 知识点入口

  1. Object.entries() - JavaScript | MDN (mozilla.org) (opens new window)
  2. Array.prototype.reduce() - JavaScript | MDN (mozilla.org) (opens new window)
  3. Map - JavaScript | MDN (mozilla.org) (opens new window)