[英]Traverse recursive json tree and merge
我試圖遍歷遞歸 json 樹如下(json2),如果標識符匹配如下,則與另一個 json(json)合並。 請注意,只要對象可用,它就可能有對象或對象,但無論標識符如何位於同一對象層次結構中。
注意:標識符值始終是唯一的
我已經演練了 underscore.js 庫,但找不到任何符合此要求的函數。 在正常列表情況下, 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
},
]
}
至少您需要一些迭代和遞歸樣式來獲取用於設置新屬性的正確內部對象。
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>');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.