如果两个不同的对象具有相同的关键字名称,请合并它们的值


let obj1 = { names: ["Zack","Cody"]};
let obj2 = { names: ["John","Jake"] };

结果在:obj1 = { names: ["Zack","Cody","John","Jake"]}

我尝试过的:

if (Object.keys(obj1) == Object.keys(obj2)) {
Object.values(obj1) = [...Object.values(obj1), ...Object.values(obj2)];
}

遍历obj1中的键,对于obj2中存在的每个键,将其值合并到obj1:中

let obj1 = { names: ["Zack","Cody"]};
let obj2 = { names: ["John","Jake"] };
Object.keys(obj1).forEach(function(k) {
if ( obj2[k] ) { // obj2 contains this key
obj1[k].push( ...obj2[k] ) // Add the values from obj2's key to obj1's key
}
});

如果每个对象的属性不存在,您可以迭代该属性并将其添加到新对象中。为了处理其他对象中存在相同键的合并,我们可以定义一个合并策略函数来解决冲突。

let obj1 = { names: ["Zack","Cody"]};
let obj2 = { names: ["John","Jake"] };
function mergeObjs(objects, mergeStrategy) {
mergeStrategy = mergeStrategy || ((oldV, newV) => newV);
const result = {};
for (let ob of objects) {
for (let [k, v] of Object.entries(ob)) {
const oldV = result[k];
result[k] = (oldV == undefined) ? v: mergeStrategy(oldV, v); 
}
}
return result;
}
console.log(mergeObjs([obj1, obj2], (oldV, newV) => oldV.concat(newV)));

该函数只允许每次合并使用一种策略,这对于更复杂的情况可能有点限制,但对于像这样的简单情况,它是可以的

您可以通过将值包装到数组元素中并使其变平(或注释中建议的concat(来连接

let obj1 = { names: ["Zack", "Cody"] }
let obj2 = { names: ["John", "Jake"] }
const mergeObj = (obj1Raw = {}, obj2Raw = {}) => {
// shallow clone for demo only
let obj1 = { ...obj1Raw }
let obj2 = { ...obj2Raw }
for (const prop in obj2) {
if (obj1.hasOwnProperty(prop)) {
obj1[prop] = [obj1[prop], obj2[prop]].flat()
} else {
obj1[prop] = obj2[prop]
}
}
return obj1
}
console.log(mergeObj(obj1, obj2))

您可以尝试lodash.merge,这是一个强大的功能,可以合并多个对象

var object = {
'a': [{ 'b': 2 }, { 'd': 4 }]
};

var other = {
'a': [{ 'c': 3 }, { 'e': 5 }]
};

_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }

这里有一个使用Object.entriesObject.fromEntriesArray#map的行,假设属性共享相同的密钥名称总是数组:

let obj1 = { names: ["Zack","Cody"] };
let obj2 = { names: ["John","Jake"] };
const result = { 
...obj1, 
...Object.fromEntries(Object.entries(obj2).map(([k, v]) => [
k, obj1[k] ? [...obj1[k], ...v] : v
]))
};
console.log(result);

在您的代码中,您正在比较两个数组Object.keys(obj1)Object.keys(obj2)。这个条件永远不会成立,因为没有两个数组是相等的,因为它们引用了不同的内存位置。

为了解决这个问题,你可以比较它们的内容。这就是我在下面的片段中所做的-

let obj1 = { names: ["Zack","Cody"]};
let obj2 = { names: ["John","Jake"]};
if (Object.keys(obj1)[0] ==  Object.keys(obj2)[0]) { 
Object.values(obj1)[0].push(...Object.values(obj2)[0]);
console.log(obj1.names); 
}

我只是比较上面片段中两个对象中的第一个键。如果您想对两个对象中的每个键都执行此操作,那么可以使用索引替换[0]的循环。

注意-如果要使用上述方法,那么两个对象中键的顺序很重要。

最新更新