如何在JavaScript中合并两个对象数组

5

我有一个简单的问题。我有两个数组A和B,如果B中具有相同的ID,我想保留A对象。 例如:

const A = [{id: "price", value: "1"}]

const B = [{id: "price", value: "0"}, {id: "number", value: "0"}]

期望的结果:

[{id: "price", value: "1"}, {id: "number", value: "0"}}]

我该如何做到这一点?

我曾试图对A进行映射并在A中对B进行foreach,但它没有起作用。


你想替换 A 的对象还是 B 的对象?预期结果不明确。 - ibrahim mahrir
术语是“合并”,已经被多次涵盖... - Heretic Monkey
我已经编辑过了。没错,我想把这两个数组合并成一个。 - Tiago Castro
如果A和B具有相同的ID,你想保留A还是B?你的问题与你期望的结果不符。 - yqlim
2
可能是重复的问题:es6合并两个对象数组并覆盖现有对象 - Heretic Monkey
显示剩余3条评论
3个回答

8
const result = A.concat(B.filter(bo => A.every(ao => ao.id != bo.id)));

将来自A的所有对象与不在A中的来自B的对象连接起来(通过过滤仅来自B的对象,其中没有与A中具有相同id的对象)。

示例:

const A = [{id: "price", value: "1"}];

const B = [{id: "price", value: "0"}, {id: "number", value: "0"}];

const result = A.concat(B.filter(bo => A.every(ao => ao.id != bo.id)));

console.log(result);


1
您需要在合并的数组上使用reduce函数 - 同时将value转换为数字。

const A = [{id: "price", value: "1"}];
const B = [{id: "price", value: "0"}, {id: "number", value: "0"}];
const res = Object.values([...A, ...B].reduce((acc, { id, value }) => {
  if (acc[id]) acc[id].value += parseInt(value);
  else acc[id] = { id, value: parseInt(value) };
  return acc;
}, {}));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }


问题在于我的值并不总是一个数字。 - Tiago Castro
那么你的值将是什么?十进制数? - Jack Bashford
它可以是数字或字符串。我想要替换。 - Tiago Castro

0

你可以尝试另一种选项(我相信它的时间复杂度是O(n)),即将数组转换为以id为键的对象,然后使用extend函数(jquery.extend或纯js实现),最后再将合并后的对象转换回数组。

const A = [{id: "price", value: "1"}];

const B = [{id: "price", value: "0"}, {id: "number", value: "0"}];

//convert arrays to objects
var Bx = {};
B.forEach(i => Bx[i.id] = i);

var Ax = {};
A.forEach(i => Ax[i.id] = i);

//copy all matching id properties from A to B
A.forEach(i => Bx[i.id] = Ax[i.id]);

//convert the merged object to array
var C = [];
Object.getOwnPropertyNames(Bx).forEach(i => C.push(Bx[i]));

console.log(C);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接