Javascript 如果两个不同的对象具有相同的键名,则合并它们的值
结果为:obj1={names:[Zack,Cody,John,Jake]} 我所尝试的:Javascript 如果两个不同的对象具有相同的键名,则合并它们的值,javascript,object,ecmascript-6,Javascript,Object,Ecmascript 6,结果为:obj1={names:[Zack,Cody,John,Jake]} 我所尝试的: let obj1 = { names: ["Zack","Cody"]}; let obj2 = { names: ["John","Jake"] }; 在代码中,您比较了两个数组-Object.keysobj1和Object.keysobj2。这种情况永远不会是真的,因为没有两个数组是相等的,因为它们引用了不同的内存位置
let obj1 = { names: ["Zack","Cody"]};
let obj2 = { names: ["John","Jake"] };
在代码中,您比较了两个数组-Object.keysobj1和Object.keysobj2。这种情况永远不会是真的,因为没有两个数组是相等的,因为它们引用了不同的内存位置 为了解决这个问题,你可以比较它们的内容。这就是我在下面的片段中所做的- 设obj1={names:[Zack,Cody]}; 让obj2={names:[John,Jake]}; 如果Object.keysobj1[0]==Object.keysobj2[0]{ Object.valuesobj1[0]。推送…Object.valuesobj2[0]; console.logobj1.name;
} 您可以按照@ggorlen在注释中的建议,将值包装到数组元素中并展平或压缩 设obj1={names:[Zack,Cody]} 让obj2={names:[John,Jake]} const mergeObj=obj1Raw={},obj2Raw={}=>{ //浅克隆仅用于演示 设obj1={…obj1Raw} 设obj2={…obj2Raw} 对于obj2中的常量属性{ 如果obj1.hasOwnPropertyprop{ obj1[prop]=[obj1[prop],obj2[prop]]。平坦 }否则{ obj1[prop]=obj2[prop] } } 返回obj1 } console.logmergeObjobj1、obj2这里有一个使用Object.entries、Object.fromEntries和Arraymap的线性表达式,假设属性共享相同的键名,那么它们总是数组: 设obj1={names:[Zack,Cody]}; 让obj2={names:[John,Jake]}; 常量结果={ …obj1, …Object.fromEntriesObject.EntriesObject.map[k,v]=>[ k、 obj1[k]?[…obj1[k],…v]:v ] }; console.logresult 您可以尝试使用强大的功能合并多个对象
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
}
});
该函数只允许每次合并使用一种策略,这对于更复杂的情况可能有点限制,但对于像这样的简单情况则可以。为什么不合并名称?obj1.names.push…obj2.names?您不能分配给Object.values之类的函数调用。其他未命名的键如何?@kmoser I重构了question@ggorlen我只是试着把这句话放在if语句中,但obj1仍然只返回到Zack和Cody这不是我想要的,如果它们具有相同的键名,则此时我要对obj1的值执行此操作,因为我的对象具有不同的键names@teestunna您能检查我更新的答案并告诉我这是否解决了您的问题吗?如果不支持.flat,您可以使用[…obj1[prop]、…obj2[prop]]或obj1[prop].concatobj2[prop].R.I.P可读性,Mhmdrz_A Lol的R.I.P绩效,ES6的典型滥用案例
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)));