簡體   English   中英

以樹形結構排列JSON

[英]Arrange JSON in tree structure

我有一個普通的JSON,包含了其依賴對象的ID。

 var array1=  

    [
        {
            "id": 84,
            "outputTypeId": 900000000000002,
            "previousOutputTypeActivitySeqMappingId": null,
            "isRemoved": false,
            "isPrimary": false
        },
        {
            "id": 95,
            "outputTypeId": 900000000000002,
            "previousOutputTypeActivitySeqMappingId": 84,
            "isRemoved": false,
            "isPrimary": false
        },
        {
            "id": 150,
            "outputTypeId": 900000000000002,
            "previousOutputTypeActivitySeqMappingId": 95,
            "isRemoved": false,
            "isPrimary": false
        },
        {
            "id": 160,
            "outputTypeId": 900000000000002,
            "previousOutputTypeActivitySeqMappingId": 95,
            "isRemoved": false,
            "isPrimary": false
        }
    ]

我想通過識別“ id”和“ previousOutputTypeActivitySeqMappingId”並將其推入名為items的新數組中,將其轉換為以下格式

var array1=

    [{
        "id": 84,
        "outputTypeId": 900000000000002,
        "previousOutputTypeActivitySeqMappingId": null,
        "isRemoved": false,
        "isPrimary": false,
        "items": [
            {
                "id": 95,
                "outputTypeId": 900000000000002,
                "previousOutputTypeActivitySeqMappingId": 84,
                "isRemoved": false,
                "isPrimary": false,
                "items": [
                    {
                        "id": 150,
                        "outputTypeId": 900000000000002,
                        "previousOutputTypeActivitySeqMappingId": 95,
                        "isRemoved": false,
                        "isPrimary": false,
                        "items": []
                    },
                    {
                        "id": 160,
                        "outputTypeId": 900000000000002,
                        "previousOutputTypeActivitySeqMappingId": 95,
                        "isRemoved": false,
                        "isPrimary": false,
                        "items": []
                    }
                ]
            }
        ]
    }]

我嘗試的代碼如下:我首先以新格式創建了一個虛擬對象:

var dummyObj= {
        "id": 84,
        "outputTypeId": 900000000000002,
        "previousOutputTypeActivitySeqMappingId": null,
        "isRemoved": false,
        "isPrimary": false
    }
function populateObj(array1, arrObj) {
   for (var i = 0; i < array1.length; i++) {
        if (array1[i].id == arrObj.parentActivityId) {
            array1[i].items.push(arrObj);
        } else {
            populateObj(array1[i].items, arrObj);
        }
    }
};

populateObj(dummyObj);

由於我不想在一開始就對一個虛擬對象進行硬編碼。 有什么方法可以使用javascript實現此轉換?
謝謝。

使用一些功能和一點遞歸就可以很容易地做到這一點。

第一個函數將整個源數組作為一個源對象,並添加items屬性:

function createObject(sourceArray, obj)
{
    obj.items = createArray(sourceArray, obj.id);
  return obj;
}

依次使用另一個函數為子級過濾源數組:

function createArray(sourceArray, id){
    return sourceArray.filter(function(e){
                                return e.previousOutputTypeActivitySeqMappingId == id;
                             })
                             .map(function(e){
                                 return createObject(sourceArray,e);
                             })
}

您會注意到,在tun中,它回調了createObject函數以遞歸方式繼續構建樹。

最后一部分是通過查找具有null父值的項目來解決所有問題

var result = createArray(input,null);

實時示例: https//jsfiddle.net/3epjb93j/

function group(arr) {
    var t={};
    arr.forEach(function(obj) {
        if (!obj.id) throw 'object found without id!';
        t[obj.id]=obj;
    });
    var result=[];
    arr.forEach(function(obj) {
        if (!obj.previousOutputTypeActivitySeqMappingId) {
            result.push(obj);
        } else {
            var parent=t[obj.previousOutputTypeActivitySeqMappingId];
            if (!parent) throw('parent with id '+obj.previousOutputTypeActivitySeqMappingId+' not found!');
            var items=parent.items;
            if (!items) {
                items=[];
                parent.items=items;
            }
            items.push(obj);
        }
    });
    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM