Javascript 递归地将关联树样式数组转换为普通数组

Javascript 递归地将关联树样式数组转换为普通数组,javascript,arrays,recursion,Javascript,Arrays,Recursion,我有一个来自数据源(我不控制)的关联数组,如下所示: { "name": "foo", "children": { "#1": { "count": 2, "children": { "#2": { "count": 4, "children": { "#5"

我有一个来自数据源(我不控制)的关联数组,如下所示:

{
    "name": "foo",
    "children": {
        "#1": {
            "count": 2,
            "children": {
                "#2": {
                    "count": 4,
                    "children": {
                        "#5": ...
                    }
                },
                "#4": {
                    "count": 3,
                    "children": {
                        "#6": ...
                    }
                }

            }
        }
    }
}
{
    "name": "foo",
    "children": [
        {
            "id": "#1",
            "count": 2,
            "children": [
                {
                    "id": "#2",
                    "count": 4,
                    "children": [...]
                },
                {
                    "id": "#4",
                    "count": 3,
                    "children": [...]
                }
            ]
        },
    ]
}
正如您所看到的,它是一个不断扩展的树结构,使用ID作为键。我想将其转换为普通数组,这样我就可以在浏览器中使用lodash,以便更轻松/更快地进行操作

结果应该如下所示:

{
    "name": "foo",
    "children": {
        "#1": {
            "count": 2,
            "children": {
                "#2": {
                    "count": 4,
                    "children": {
                        "#5": ...
                    }
                },
                "#4": {
                    "count": 3,
                    "children": {
                        "#6": ...
                    }
                }

            }
        }
    }
}
{
    "name": "foo",
    "children": [
        {
            "id": "#1",
            "count": 2,
            "children": [
                {
                    "id": "#2",
                    "count": 4,
                    "children": [...]
                },
                {
                    "id": "#4",
                    "count": 3,
                    "children": [...]
                }
            ]
        },
    ]
}
转换对象不是问题所在,但我无法解决的是如何递归地执行此操作,以便结构不会变平,并且所有子对象都位于正确的父对象下。我在这里浏览了以前的文章,但找不到任何有助于这种转换的东西。

您可以使用Object.keys()和递归函数,如下所示

var a = {
    "name": "foo",
    "children": {
        "#1": {
            "count": 2,
            "children": {
                "#2": {
                    "count": 4,
                    "children": {
                        "#5": {}
                        }
                },
                "#4": {
                    "count": 3,
                    "children": {
                        "#6": {}
                        }
                }

            }
        }
    }
}

function convertKeysToArray(obj) {
    if (obj.children !== undefined) {
        var arr = []
        Object.keys(obj.children).forEach(function(key) {
            var child = obj.children[key];
            convertKeysToArray(child);
            child.id = key;
            arr.push(child)
        }) 

        obj.children = arr;
    }
}

convertKeysToArray(a)
console.log(JSON.stringify(a, null, "     "))

var a={
“名称”:“foo”,
“儿童”:{
"#1": {
“计数”:2,
“儿童”:{
"#2": {
“计数”:4,
“儿童”:{
"#5": {}
}
},
"#4": {
“计数”:3,
“儿童”:{
"#6": {}
}
}
}
}
}
}
函数数组(obj){
if(obj.children!==未定义){
var arr=[]
Object.keys(对象子对象).forEach(函数(键){
var child=obj.childs[key];
数组(子数组);
child.id=key;
arr.push(儿童)
}) 
obj.children=arr;
}
}
转换器阵列(a)
so.log(a)

var so={
日志:功能(obj){
document.getElementById(“so”).innerHTML=JSON.stringify(obj,null,”);
}
}

到目前为止,您尝试了哪些方法?我主要尝试提取“关键路径”,以便在创建“子”数组的过程中从头到尾处理它们。然而,我不知道如何获得这些“关键路径”以及如何实现它们,例如,2和4仍然在1之下,而不是作为两个单独的1,每个1个孩子。谢谢。我确信有一些非常简单优雅的解决方案,就在这里。我也有过类似的经历,但我似乎真的不善于递归思考。