簡體   English   中英

如何在 JavaScript 中壓平一棵 object 樹

[英]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.

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