遍历递归json树并合并

Traverse recursive json tree and merge

本文关键字:合并 json 递归 遍历      更新时间:2023-09-26

我正试图遍历如下(json2)所示的递归json树,如果标识符匹配如下,则与另一个json(json)合并。请注意,只要对象可用,它就可能有的对象

注意:标识符值始终是唯一的

我浏览了underscore.js库,但找不到任何符合此要求的函数。在正常的列表情况下,findWhere将足以解决问题,但事实并非如此,因为它具有多级层次结构。

json2:

{
    "identifier1": "123456",
    "identifier2": "234567"
}

json1:

{
    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>');