我试图遍历递归的json树,如下所示(json2),如果标识符匹配如下,则与另一个json (json)合并。请注意,每当对象可用时,它可能具有对象或 object ,但是标识符在同一对象层次结构中的任何形式。
注意:标识符值总是唯一的。
我已经浏览了underscore.js库,但是找不到符合这个要求的任何函数。在正常的list情况下,findWhere足以解决问题,但情况并非如此,因为它有多个层次结构。
JSON 2:
{
"identifier1": "123456",
"identifier2": "234567"
}JSON 1:
{
subtopic: [
{
"title": "title 1",
"subtitle": "title 2",
"objects": [{
"title": "123"
"label": "456"
"objects": [
{
"identifier": "identifier1",
"object": {
"object-1": "123",
"object-2": "456"
}
},
{
"identifier": "identifier2",
"object": {
"object-1": "123",
"object-2": "456"
}
}
]
}]
},
{
...
...
Similar as above
},
]
}合并后
{
subtopic: [
{
"title": "title 1",
"subtitle": "title 2",
"objects": [{
"title": "123"
"label": "456"
"objects": [
{
"result": "123456",
"identifier": "identifier1",
"object": {
"object-1": "123",
"object-2": "456"
}
},
{
"result": "234567"
"identifier": "identifier2",
"object": {
"object-1": "123",
"object-2": "456"
}
}
]
}]
},
{
...
...
Similar as above
},
]
}发布于 2016-04-30 14:13:08
至少您需要一些迭代和递归样式来获得正确的内部对象来设置新属性。
function merge(array, object) {
Object.keys(object).forEach(function (k) {
function iter(a) {
if (a.identifier === k) {
r = a;
return true;
}
return Array.isArray(a.objects) && a.objects.some(iter);
}
var r;
array.some(iter);
if (r) {
r.result = object[k];
}
});
}
var object2 = { "identifier1": "123456", "identifier2": "234567" },
object1 = { subtopic: [{ "title": "title 1", "subtitle": "title 2", "objects": [{ "title": "123", "label": "456", "objects": [{ "identifier": "identifier1", "object": { "object-1": "123", "object-2": "456" } }, { "identifier": "identifier2", "object": { "object-1": "123", "object-2": "456" } }] }] }] };
merge(object1.subtopic, object2);
document.write('<pre>' + JSON.stringify(object1, 0, 4) + '</pre>');
https://stackoverflow.com/questions/36955685
复制相似问题