Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果两个不同的对象具有相同的键名,则合并它们的值_Javascript_Object_Ecmascript 6 - Fatal编程技术网

Javascript 如果两个不同的对象具有相同的键名,则合并它们的值

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。这种情况永远不会是真的,因为没有两个数组是相等的,因为它们引用了不同的内存位置

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

我所尝试的:

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)));