Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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 - Fatal编程技术网

Javascript 合并两个对象而不覆盖

Javascript 合并两个对象而不覆盖,javascript,Javascript,我有两个类似的Javascript对象: "Object 1": { "a": { "1": "test 1", "2": "test 2" }, "b": { "3": "test 3", "4": "test 4" }, } "Object 2": { "a": { "1": "test 5", "2": "test 6" }, "b":

我有两个类似的Javascript对象:

"Object 1": {
    "a": {
        "1": "test 1",
        "2": "test 2"
    },
    "b": {
        "3": "test 3",
        "4": "test 4"
    },
}

"Object 2": {
    "a": {
        "1": "test 5",
        "2": "test 6"
    },
    "b": {
        "3": "test 7",
        "4": "test 8"
    },
}
两者之间的唯一区别是最深层次的值。我希望合并它们,使生成的对象如下所示:

"Object 4": {
    "a": {
        "1": ["test 1", "test 5"],
        "2": ["test 2", "test 6"]
    },
    "b": {
        "3": ["test 3", "test 7"],
        "4": ["test 4", "test 8"]
    },
}
基本上,我只想把最深的值合并到列表中。有人能帮忙吗

编辑:我的最终目标是将这些值吐出到表中,如下所示:

<table>
    <tr>
        <td>test 1</td>
        <td test 5</td>
    </tr>
    <tr>
        <td>test 2</td>
        <td test 6</td>
    </tr>
    <tr>
        <td>test 3</td>
        <td test 7</td>
    </tr>
    <tr>
        <td>test 4</td>
        <td test 8</td>
    </tr>
</table>

测试1

var o={
1: {
“a”:{“1”:“测试1”,“2”:“测试2”},
“b”:{“3”:“测试3”,“4”:“测试4”},
}, 2: {
“a”:{“1”:“测试5”,“2”:“测试6”},
“b”:{“3”:“测试7”,“4”:“测试8”},
}
}
函数合并对象(基本、合并){
//循环遍历要合并的项中的键(`toMerge`)
for(变量输入到合并中){
//如果'base[key]`不是一个对象,请将其设置为一个对象
基[键]=基[键]| |{}
//在`toMerge[key]中查看钥匙`
for(变量k在变大[键]){
//如果基已在'base[key][k]处具有数组`
if(Array.isArray(base[key][k])){
//然后按下当前元素
基本[key][k]。推送(合并[key][k])
}否则{
//否则,创建一个数组并将'toMerge[key][k]`设置为第一个元素
基[key][k]=[toMerge[key][k]]
}
}
}
返回基地
}
功能合并(o1,o2){
返回mergeObject(mergeObject({},o1),o2)
}
document.write(JSON.stringify(merge(o[1],o[2]))
我会使用。此例程将用于两棵树中任意级别的叶值,而不仅仅是第二个级别

函数仅为对象(v)
{
//_.isObject()为函数和数组返回true。但此谓词仅为对象返回true
返回&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.isArray(v)
}
函数concat_leaf_值(obj_1,obj_2)
{
var result={}
var all_keys=u.union(j.keys(obj_1),j.keys(obj_2))
_.每个(所有)按键、功能(按键)
{
var new_val
var v1=对象1[键]
var v2=对象2[键]
if(仅为对象(v1)和仅为对象(v2))
{
new_val=concat_leaf_值(v1,v2)//递归
}
其他的
{
new_val=_.compact([].concat(v1.concat(v2))
//如果v1或v2是一个数组,则它们将连接在一起,而不是嵌套在一起。
//如果v1或v2不存在,我们将剥离任何未定义的/null值。
//如果您有意希望在树中使用null/undefined数组,则此子句
//应该改变
}
结果[键]=新值
})
返回结果
}
//concat_leaf_值({a:{a:1,b:2},b:5},{a:{a:10,b:20},b:50})=>{a:{a:{a:[1,10],“b:[2,20]},“b:[5,50]}
您可以使用下划线

以下是片段:

_.map(object1, function(val, key){
  if(object2[key] != undefined) {
    _.map(val, function(val1, key1){
        if(object2[key][key1] != undefined){
            val[key1] = val1  + "," + object2[key][key1];
        }
    });
  }
});

如果可以在源代码处将其清理成更合理的结构,那么首先我的问题是我正在读取两个单独的JSON文件以进行产品比较,据我所知,这是我将它们结构化的唯一方法。我无法合并这两个文件,因为可能需要我比较一组中的任意两个文件。JavaScript约定更喜欢
camelCase
而不是
snake\u case
。这使您的代码更难阅读,特别是因为您使用的是下划线库,这使我在每个
\uuuu
上都看了两遍。太好了,谢谢您的回答,我也会完成这一步。