如何将树转换为数组?

Nat*_*iya 3 arrays tree list node.js

我有一个树对象,它是不规则的树,每当我运行代码时,孩子的名字和键值就可以更改。例如:

{
    addressRouter: 192.168.0.1,   
    addresses: 
        {
            address1: 'A',   

        },
        {
            address2: 'B',   

        },
        {
            ports: [
                {
                    portA: 'C',   
                    portB: null
                },


        }
    route: 'D',

}
Run Code Online (Sandbox Code Playgroud)

所以名称:“ addressRouter”,“ addresses”,“ address1”等及其键是不可预测的,但是我需要将树对象转换为以下格式的数组:

addressRouter
addresses/address1
addresses/address2
addresses/ports/portA
addresses/ports/portB
route
Run Code Online (Sandbox Code Playgroud)

然后把钥匙放在旁边。

我有此功能来构造树,这是正确的:

const iterate = (obj, obj2) => {
  Object.keys(obj).forEach(key => {

    obj2[key] = obj[key];

    if (typeof obj[key] === 'object') {
        iterate(obj[key], obj2)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

但是在调试之后,我意识到它并没有获得所有分支。

Abi*_*ash 5

我们可以使用递归函数遍历树并以所需格式获取键。

我假设给定树对象中的地址是对象数组

function processTree(obj, rootKey) {
    const arr = [];
    obj && Object.keys(obj).forEach(key => {
        const val = obj[key];  
        if (val && val instanceof Array) {
            val.forEach(item => arr.push(...processTree(item, key)))
        }else if (val && typeof(val) == "object") {
            arr.push(...processTree(val, key));
        }else {
            arr.push(key);
        }
    });
    return rootKey ? arr.map(item => rootKey + "/" + item) : arr;
}

console.log(processTree(tree, null));
Run Code Online (Sandbox Code Playgroud)

结果: ["addressRouter", "addresses/address1", "addresses/address2", "addresses/ports/portA", "addresses/ports/portB", "route"]