[英]Javascript: Turn a nested array into a single array using a nested for loop
[英]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.