数组对像合并,用新的内容覆盖老的怎么解决

数组对像合并

//默认数组队象

list:[
    {a:'标题',b:'5',c:'text'},
    {a:'简介',b:'50',c:'text'},
]

新设置的数组队象 覆盖合并到上面的数组队象中,用新的数据覆盖默认数据,

list:[
    {a:'标题',b:'10',d:'time'},
    {a:'简介',b:'150'},
]

最终合并后得到

list:[
    {a:'标题',b:'10',c:'text',d:'time'},
    {a:'简介',b:'150',c:'text'},
]

求问有什么好方法!

阅读 4.5k
4 个回答

如果a是唯一值

let list1 = [
    {a:'标题',b:'5',c:'text'},
    {a:'简介',b:'50',c:'text'},
]
const list2 = [
    {a:'标题',b:'10',d:'time'},
    {a:'简介',b:'150'},
]

list1 = list1.map(item => {const temp = list2.find(r => r.a===item.a)||{};return {...item,...temp} })

函数:

function merge(dest, source, identity) {
    dest.forEach(d => {
        const sObj = source.find(s => identity(d, s));
        if (sObj) {
            Object.assign(d, sObj);
        }
    });
    return dest;
}

使用:

const list1 = [
    { a: "标题", b: "5", c: "text" },
    { a: "简介", b: "50", c: "text" },
];

const list2 = [
    { a: "标题", b: "10", d: "time" },
    { a: "简介", b: "150" },
];

console.log(merge(list1, list2, (d, s) => d.a === s.a));

输出结果:

[
  { a: '标题', b: '10', c: 'text', d: 'time' },
  { a: '简介', b: '150', c: 'text' }
]

这个问题的关键在于合并的依据是什么。一般最常见的情况是每项数据都有一个唯一的 id,合并时相同 id 的数据进行 Object.assign。

若是根据数组顺序进行合并的话,那就更简单了,取两个数组中最长的一个 length 值,用 for 遍历直接合并即可。但这种方式不严谨,一般不推荐这样做。

用于合并配置,所以新的配置,是要覆盖源有的,键值的!
两个朋友的代码都挺好。 速度不同,
比我自己FOR出来的快多了

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