JS对象数组中根据对象的某一项值进行合并

问题描述

在同一个对象数组中根据某一个属性值将有该属性的两个对象的其他值合并为一个对象

arr = [
    {id: '1111',string: '这是1111'},
    {id: '1111',number: '这是id1111'},
    {id: '2222',string: '这是2222'},
    {id: '3333',string: '这是3333'},
    {id: '4444',string: '这是4444'}
 ]
 // 期待得到
 arr = [
    {id: '1111',string: '这是1111',number: '这是number'},
    {id: '2222',string: '这是2222'},
    {id: '3333',string: '这是3333'},
    {id: '4444',string: '这是4444'},
  ]

有无大佬帮帮忙瞅一眼

阅读 3.7k
3 个回答

这种样子?

const arr = [
  { id: '1111', string: '这是1111' },
  { id: '1111', number: '这是id1111' },
  { id: '2222', string: '这是2222' },
  { id: '3333', string: '这是3333' },
  { id: '4444', string: '这是4444' },
];

function merge(originalData) {
  const mergedMap = originalData.reduce((prev, cur) => {
    prev[cur.id] = {
      ...(prev[cur.id] || {}),
      ...cur,
    };
    return prev;
  }, {});

  return Object.values(mergedMap);
}

console.log(merge(arr));
combineSameIdObj = (arr) => {
   const map = new Map()

   for(let i = 0; i < arr.length; ++i) {
     if(!map.has(arr[i].id)) map.set([arr[i]])
     else map.get(arr[i].id).push(arr[i])
   }

  const ans = []

  for(const key of map.keys()) {
     ans.push(Object.assign({},...map.get(key)))
  }
  return ans
}
let temp = arr.reduce((data, item) => {
  let index = data.findIndex(i => i.id == item.id)
  if (index != -1) {
    data[index] = {...data[index], ...item}
  } else {
    data.push(item)
  }
  return data
}, [])
console.log(temp)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题