对象数组有相同key值的对象合并?

obj4 = [
  {id: 1, num: 2, name: 'Lucy', age: '13'},
  {name: 'Jerry', num: '-', age: '12'},
  {id: 3, num: '+', name: 'Jerry'},
  {id: 5, num: 7, name: 'Tom', age: '10'},
  {id: 4, name: 'Hebe', age: '15'},
  {name: 'Tom', sex: '男'},
]

obj4变成obj5,添加xnzs属性,值为id+num,两者是number类型的则相加,不是number的改为0

obj5 = [
  {name: 'Tom', sex: '男', id: 5, num: 7, age: '10', xnzs: 12},
  {id: 3, num: '+', name: 'Jerry', age: '12', xnzs: 3},
  {id: 1, num: 2, name: 'Lucy', age: '13', xnzs: 3},
  {id: 4, name: 'Hebe', age: '15', xnzs: 4},
]
阅读 2.3k
3 个回答

name 合并,添加属性 xnzs = id + num,如果 num 不是数字,则 xnzs = id,如果是这个需求的话可以

Object.values(obj4.reduce((o, v) => (Object.assign(o[v.name] ??= {}, v), o), {})).map(v => (v.xnzs = v.id + (v.num | 0), v))
Object.values(obj4.reduce((res, v) => {
    res[v.name] = {xnzs: v.id ? v.id + (v.num||0) : '', ...v, ...res[v.name]}
    return res
}, {}))

示例里还有num是"+","-"针对这种情况没有说明怎么处理,就全部用id+num了,有不符合的地方再适当修改下

const obj5 = Object
    .entries(obj4
        .reduce((acc, { name, ...rest }) => (
            Object.assign(acc[name] ??= {}, rest),
            acc
        ), {})
    )
    .map(([ name, rest ]) => ({
        name, ...rest, xnzs: rest.id + rest.num
    }))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题