Javascript 合并两个对象而不覆盖
我有两个类似的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":
"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
上都看了两遍。太好了,谢谢您的回答,我也会完成这一步。