簡體   English   中英

使用javascript將平面數組轉換為嵌套數組

[英]Turn flat array into nested array using javascript

我希望將此平面數組轉換為嵌套數組,但它會繼續返回為空。 不知道如何解決這個問題或我所缺少的,但這令我發瘋。

平面數組:

var names =[
{ name: 'b', parent: 'Brown' },
{ name: 'a', parent: 'Brown' },
{ name: 'h', parent: 'Green' },
{ name: 'c', parent: 'Green' },
];

所需的數組輸出:

[{
    name: 'Brown',
    children: [{
            name: 'a',
            children: []
        },
        {
            name: 'b',
            children: []
        }
    ]
}, {
    name: 'Green',
        children: [{
                name: 'h',
                children: []
            },
            {
                name: 'c',
                children: []
            }
        ]
    }
}]

Js:

function getNestedChildren(arr, parent) {
    var children = [];
    for(var i =0; i < arr.length; ++i) {
        if(arr[i].parent == parent) {
            var grandChildren = getNestedChildren(arr, arr[i].name)

            if(grandChildren.length) {
                arr[i].children = grandChildren;
            }
            children.push( arr[i]);
        }
    }
    return children;
}
var nest = getNestedChildren(names, names.parent);
console.log( nest);

您可以創建一個新對象,為每個項目將一個數組分配給具有父名稱的鍵,然后將該項目連接到該數組

 var names =[ { name: 'b', parent: 'Brown' }, { name: 'a', parent: 'Brown' }, { name: 'h', parent: 'Green' }, { name: 'c', parent: 'Green' }, ]; const getGroup=(groups, parent) => { let group = groups.find(g=>g.parent===parent); if(!group){ group=({parent,children:[]}); groups.push(group); } return group; } let grouped = [] names.forEach(item=> getGroup(grouped,item.parent).children.push(item)) console.log(grouped) 

 var names =[ { name: 'b', parent: 'Brown' }, { name: 'a', parent: 'Brown' }, { name: 'h', parent: 'Green' }, { name: 'c', parent: 'Green' }, { name: 'j', parent: 'Brown' } ]; function groupBy(arr, f) { return arr.reduce((r, v, i, a, k = f(v)) => ((r[k] || (r[k] = [])).push(v), r), {}); } function nestArray(array){ var newArray=[], resultGrouped = groupBy(names, function(c) { return c.parent }); for (var key in resultGrouped){ var item=resultGrouped[key]; newArray.push({ name:key, children:item.map(function(map){ delete map.parent; map.children=[]; return map; }) }); } return newArray; } console.log(nestArray(names)); 

因此,對於初學者而言,您需要遍歷名稱並將每個父級發送到getNestedChildren()函數。

var names =[
    { name: 'b', parent: 'Brown' },
    { name: 'a', parent: 'Brown' },
    { name: 'h', parent: 'Green' },
    { name: 'c', parent: 'Green' },
];

var nest = [];

for (var i = 0; i < names.length; i++) {
    nest.push(getNestedChildren(names, names[i].parent));
} 

另外,您的getNestedChildren()當前正在嘗試修改並發送回舊名稱數組。 我建議改為創建一個新對象,然后將帶有孩子的對象發回。

function getNestedChildren(arr, parent) {
    var children = [];
    var parentObj = {};
    parentObj.name = parent;
    for(var i =0; i < arr.length; ++i) {
        if(arr[i].parent == parent) {
            children.push(getNestedChildren(arr, arr[i].name));
        }
    }
    parentObj.children = children;
    return parentObj;
}

暫無
暫無

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

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