合并两个Javascript对象,其中每个键包含多个值

合并两个Javascript对象,其中每个键包含多个值,javascript,arrays,object,nested,Javascript,Arrays,Object,Nested,我目前正在学习JavaScript,有一个关于我正在做的项目的快速问题。当前,如果要合并几个对象,如果关键点匹配,则将值添加到一起,如果关键点不存在,则追加父对象,我可以执行以下操作: var test1 = { a: 12, b: 8, c: 17 }; var test2 = { a: 22, b: 8, c: 9 }; var test3 = { a: 33, b: 23, c: 1, d: 2,

我目前正在学习JavaScript,有一个关于我正在做的项目的快速问题。当前,如果要合并几个对象,如果关键点匹配,则将值添加到一起,如果关键点不存在,则追加父对象,我可以执行以下操作:

var test1 = {
    a: 12,
    b: 8,
    c: 17
};

var test2 = {
    a: 22,
    b: 8,
    c: 9
};

var test3 = {
    a: 33,
    b: 23,
    c: 1,
    d: 2,
    e: 9
};

function sumObjectsByKey(...objs) {
    return objs.reduce((a, b) => {
        for (let k in b) {
            if (b.hasOwnProperty(k))
                a[k] = (a[k] || 0) + b[k]
        }
        return a;
    }, {});
    console.log("endresult" + " " + sumObjectsByKey(test1, test2, test3));
当只有一个值时,这似乎工作得很好。例:a:22

这就是我的问题所在。如果对象看起来像这样会怎样:

var test1 = {
testSystem: {crit: "1", high: "0", med: "1", low: "22"}
testSystem1: {crit: "1", high: "0", med: "1", low: "22"}
testSystem2: {crit: "1", high: "0", med: "1", low: "22"}
testSystem3: {crit: "1", high: "0", med: "1", low: "22"}
};

var test2 = {
testSystem: {crit: "19", high: "305", med: "21", low: "212"}
4testSystem1: {crit: "111", high: "10", med: "31", low: "62"}
testSystem2: {crit: "21", high: "3", med: "11", low: "232"}
testSystem4: {crit: "13", high: "40", med: "15", low: "22"}
testSystem7: {crit: "21", high: "3", med: "112", low: "32"}
};

var test3 = {
testSystem5: {crit: "1", high: "0", med: "122", low: "122"}
testSystem2: {crit: "2", high: "6", med: "1", low: "222"}
testSystem3: {crit: "6", high: "0", med: "12", low: "212"}
testSystem4: {crit: "4", high: "8", med: "11", low: "2"}
};

我如何修改上面的代码进行迭代以达到与上面相同的效果?任何解释或帮助都将不胜感激。谢谢。

您可以检查第二个对象是否有嵌套对象,然后为嵌套对象调用函数

函数和(a,b){
Object.keys(b).forEach(k=>{
如果(b[k]&&typeof b[k]=='object')返回和(a[k]=a[k]|{},b[k]);
a[k]=(+a[k]| 0)++b[k];
});
返回a;
}
var test1={testSystem:{crit:“1”,high:“0”,med:“1”,low:“22”},testSystem1:{crit:“1”,high:“0”,med:“22”},testSystem2:{crit:“1”,high:“0”,med:“1”,low:“22”},testSystem3:{crit:“1”,high:“0”,med:“1”,low:“22”},
test2={testSystem:{crit:“19”,high:“305”,med:“21”,low:“212”},testSystem1:{crit:“111”,high:“10”,med:“31”,low:“62”},testSystem2:{crit:“21”,high:“3”,med:“11”,low:“232”},testSystem4:{crit:“13”,high:“40”,med:“15”,low:“22”},testSystem7:{crit:“21”,high:“3”,med:“112”,low:“32”},
test3={testSystem5:{crit:“1”,high:“0”,med:“122”,low:“122”},testSystem2:{crit:“2”,high:“6”,med:“1”,low:“222”},testSystem3:{crit:“6”,high:“0”,med:“12”,low:“212”},testSystem4:{crit:“4”,high:“8”,med:“11”,low:“2”};
log([test1,test2,test3].reduce(sum))

。作为控制台包装{max height:100%!important;top:0;}
您的预期输出是什么?基本上,如果键不存在,test2和test3将追加test1,否则将对相应的值求和。例如,如果每个变量都有一个“testSystem2”,那么您可以将crit、high、med和low值加在一起。如果没有匹配的“testsystem”,只需将该键和值附加到test1 obj中即可。查看减少对象数组:)感谢您的快速响应!但我很好奇,为什么我要检查第二个对象是否有嵌套对象?您希望对第一个对象进行变异,但只有当第二个对象有值要添加时,才需要检查第二个对象的属性。关于更多问题。第二个加号的原因是什么:a[k]=(+a[k]| 0)++b[k];具体来说,我说的是“++b[k]”。为什么有两个加号?这是一种将字符串转换成数字的方法。