求问数组内容合并问题

题目描述

有类似如下数组(不止这几条) 数组中id相同的对象合并,有什么更好的方法。

let arr = [
  {
    id: 1,
    title: "768768",
    url: "dasdsadsad",
  },
  {
    id: 2,
    title: "5464",
    url: "dasdsadsad",
  },
  {
    id: 3,
    title: "aaaaa",
    url: "ertert",
  },
  {
    id: 2,
    src: "adsdsds",
    info: "ssssdffdfdf",
    summary: "a345435345",
  },
  {
    id: 3,
    src: "adsdsds",
    info: "ssssdffdfdf",
    summary: "a345435345",
  },
];

希望合并成这种形式,

let arr2 = [
  {
    id: 1,
    title: "768768",
    url: "dasdsadsad",
  },
  {
    id: 2,
    title: "5464",
    url: "dasdsadsad",
    src: "adsdsds",
    info: "ssssdffdfdf",
    summary: "a345435345",
  },
  {
    id: 3,
    title: "aaaaa",
    url: "ertert",
    src: "adsdsds",
    info: "ssssdffdfdf",
    summary: "a345435345",
  },
];
阅读 2.4k
3 个回答

用映射表m保存id=>data的映射,一次遍历完事。

function mergeById (list) {
    const m = {}
    return list.filter(i => m[i.id] ? (Object.assign(m[i.id], i), 0) : (m[i.id] = i, 1))
}

终于可以在PC端回复了,首先感谢木马啊的指教。
下面贴一下我的思路

var arr2 = [],obj = {}; 
// 方法一 
arr1.forEach(function(item) {
    if (obj[item.id]) {
        Object.assign(obj[item.id], item)
    } else {
        obj[item.id] = item
    }
})
arr2 = Object.values(obj)

// 方法二 也就是木马哥的思路,他的更简洁
arr2 = arr1.filter(function(item) {
    if (obj[item.id]) {
         Object.assign(obj[item.id], item)
        return false
    } else {
         obj[item.id] = item
        return true
    } 
})
const arr = [
  {
    id: 1,
    title: "768768",
    url: "dasdsadsad",
  },
  {
    id: 2,
    title: "5464",
    url: "dasdsadsad",
  },
  {
    id: 3,
    title: "aaaaa",
    url: "ertert",
  },
  {
    id: 2,
    src: "adsdsds",
    info: "ssssdffdfdf",
    summary: "a345435345",
  },
  {
    id: 3,
    src: "adsdsds",
    info: "ssssdffdfdf",
    summary: "a345435345",
  },
];

const temp = {};
arr.map(item => {
    if (temp[item.id]) {
        temp[item.id] = {...item, ...temp[item.id]}
    } else {
        temp[item.id] = item;
    }
})
const arr2 = Object.values(temp);

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题