[英]How to flatten a object tree in JavaScript
我需要遞歸地將這棵 object 樹轉換為單個數組,並按順序向下鑽取 [parent, child, child, grandchild, grandchild, child, grandchild] 等...
嘗試了很多東西,但我有點堅持這個。 任何幫助都會很棒。 謝謝大家:)
我試過的一件事是: function flatten(inititalTree) { var flattenedTree = [];
var treeObjClone = JSON.parse(JSON.stringify(inititalTree));
var children = treeObjClone.children
if(Object.keys(children).length > 0) {
for (var key in children) {
if (children.hasOwnProperty(key)) {
var child = JSON.parse(JSON.stringify(children[key]));
flattenedTree.push(child);
var grandchild = child.children;
if(Object.keys(grandchild).length > 0) {
for (var iKey in grandchild) {
if (grandchild.hasOwnProperty(iKey)) {
var grandchildChild = JSON.parse(JSON.stringify(grandchild[iKey]));
[...flattenedTree, ...flatten(grandchildChild)];
}
}
}
}
}
}
return flattenedTree;
};
console.log(展平(樹結構))
var treeStructure = {
qty: 1,
itemId: "2158",
itemType: "Assembly",
serialNumberId: "2299",
replacedSerialNumber: null,
workOrderId: "23670",
hasSerial: true,
parentSerialNumberId: "",
assemblyBuildId: "",
children: {
2161: {
qty: 1,
itemId: "2161",
itemType: null,
serialNumberId: "2293",
replacedSerialNumber: null,
hasSerial: true,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
children: {
2156: {
qty: 1,
itemId: "2156",
itemType: null,
serialNumberId: "2265",
replacedSerialNumber: null,
hasSerial: true,
workOrderId: null,
parentSerialNumberId: "2293",
assemblyBuildId: "20259",
children: {
2453: {
qty: 1,
itemId: "2453",
itemType: null,
serialNumberId: "2254",
replacedSerialNumber: null,
hasSerial: true,
workOrderId: null,
parentSerialNumberId: "2265",
assemblyBuildId: "18048",
"children": {}
},
2454: {
qty: 1,
itemId: "2454",
itemType: null,
serialNumberId: "2244",
replacedSerialNumber: null,
hasSerial: true,
workOrderId: null,
parentSerialNumberId: "2265",
assemblyBuildId: "18048",
"children": {}
}
}
},
2157: {
qty: 1,
itemId: "2157",
itemType: null,
serialNumberId: "2292",
replacedSerialNumber: null,
hasSerial: true,
workOrderId: null,
parentSerialNumberId: "2293",
assemblyBuildId: "20259",
children: {
2832: {
qty: 1,
itemId: "2832",
itemType: null,
serialNumberId: "2227",
replacedSerialNumber: null,
hasSerial: true,
workOrderId: null,
parentSerialNumberId: "2292",
assemblyBuildId: "20256",
children: {
2827: {
qty: 19,
itemId: "2827",
itemType: null,
serialNumberId: "2200",
replacedSerialNumber: null,
hasSerial: true,
workOrderId: null,
parentSerialNumberId: "2227",
assemblyBuildId: "14176",
"children": {}
},
2832: {
qty: 0,
itemId: "2832",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2227",
assemblyBuildId: "14176",
"children": {}
}
}
}
}
}
}
},
2622: {
qty: 1,
itemId: "2622",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
"children": {}
},
2623: {
qty: 3,
itemId: "2623",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
"children": {}
},
2628: {
qty: 1,
itemId: "2628",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
"children": {}
},
2629: {
qty: 1,
itemId: "2629",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
"children": {}
},
2630: {
qty: 1,
itemId: "2630",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
"children": {}
},
2631: {
qty: 1,
itemId: "2631",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
"children": {}
},
2640: {
qty: 1,
itemId: "2640",
itemType: null,
serialNumberId: null,
replacedSerialNumber: null,
hasSerial: false,
workOrderId: null,
parentSerialNumberId: "2299",
assemblyBuildId: "23675",
"children": {}
}
}
}
所以只是為了確認,如果我理解正確的話,你有一棵樹,例如:
{
"value": 1,
"children": [
{
"value": 2,
"children": [
{
"value": 3,
"children": null
},
{
"value": 4,
"children": null
}
]
},
{
"value": 5,
"children": [
{
"value": 6,
"children": null
},
{
"value": 7,
"children": null
}
]
}
]
}
你希望結果是(注意我只把值放在那里是為了簡化它,你可以用整個對象來做):
[1,2,5,3,4,6,7]
您可以做的是使用Breadth-first Search 。 關鍵是基本上使用隊列:
function BFS(rootNode) {
const result = [];
const queue = [];
queue.push(rootNode);
while (true) {
let count = queue.length;
if (count === 0) break;
while (count > 0) {
let node = queue.shift();
result.push(node);
node.children?.forEach(child => queue.push(child));
count--
}
}
return result;
}
適用於我上面發送的輸入。
如果您希望結果為 [1,2,3,4,5,6,7](因此沿着一條路徑向下,然后是另一條路徑,然后是另一條路徑),您正在尋找Depth-first search 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.