【问题标题】:Create a nested array recursively in Node.js在 Node.js 中递归创建嵌套数组
【发布时间】:2018-05-24 13:49:53
【问题描述】:

下面是我的数组

[
    {id: 1, title: 'hello', parent: {number:0}},
    {id: 2, title: 'hello', parent: {number:0}},
    {id: 3, title: 'hello', parent: {number:1}},
    {id: 4, title: 'hello', parent: {number:3}},
    {id: 5, title: 'hello', parent: {number:4}},
    {id: 6, title: 'hello', parent: {number:4}},
    {id: 7, title: 'hello', parent: {number:3}},
    {id: 8, title: 'hello', parent: {number:2}}
]

我希望像这样嵌套的对象作为输出:

[
    {id: 1, title: 'hello', parent: 0, children: [
        {id: 3, title: 'hello', parent: 1, children: [
            {id: 4, title: 'hello', parent: 3, children: [
                {id: 5, title: 'hello', parent: 4},
                {id: 6, title: 'hello', parent: 4}
            ]},
            {id: 7, title: 'hello', parent: 3}
        ]}
    ]},
    {id: 2, title: 'hello', parent: 0, children: [
        {id: 8, title: 'hello', parent: 2}
    ]}
]

请帮助我使用递归函数在 node.js 中执行此操作。

以下是我尝试过的递归函数:

    function getNestedChildren(arr, parent) {
    var out = []
    for(var i in arr) {
        if(arr[i].parent.number == parent.number) {
            var children = getNestedChildren(arr, arr[i].id)

            if(children.length) {
                arr[i].children = children
            }
            out.push(arr[i])
        }
    }
    return out
}

请帮我解决这个问题。我是这方面的新手。

【问题讨论】:

  • 你试过什么?我们并不是真正的编码服务。你真的应该自己做一些尝试,然后问我们你在哪里卡住了。
  • 这是我尝试过但无法上传的。function getNestedChildren(arr, parent) { var out = [] for(var i in arr) { if(arr[i].parent. number == parent.number) { var children = getNestedChildren(arr, arr[i].id) if(children.length) { arr[i].children = children } out.push(arr[i]) } } return出}
  • 欢迎堆栈溢出。请将您尝试过的代码放入您的问题中,正确格式化,然后解释您得到的结果或卡住的地方,更具体地说,您希望在该代码中获得什么帮助。多行代码在 cmets 中不清晰。您可以使用“编辑”按钮来编辑您的问题,以添加您尝试过的代码和附加说明。
  • 我现在可以上传我的代码了。

标签: javascript arrays node.js recursion


【解决方案1】:

重命名一些变量帮助我解决了这个问题。

  • getNestedChildren 返回一个子数组,因此将 out 重命名为 children
  • 递归调用返回的子级是调用中正在处理的父级的孙子级。所以调用递归调用的结果grandchildren

导致代码无法运行的问题:

  • 发布代码的第 4 行使用父参数的id 属性。因此,要么确保对 getNestedChidren 的每次调用都提供具有此类属性的对象(如下所示),要么将第二个参数更改为 parentNumber 并仅提供 number 属性的数值。您的选择。

最后,避免使用for ... in 循环来迭代数组 - 请进行网络搜索以获取更多信息和讨论。

var array = [
    {id: 1, title: 'hello', parent: {number:0}},
    {id: 2, title: 'hello', parent: {number:0}},
    {id: 3, title: 'hello', parent: {number:1}},
    {id: 4, title: 'hello', parent: {number:3}},
    {id: 5, title: 'hello', parent: {number:4}},
    {id: 6, title: 'hello', parent: {number:4}},
    {id: 7, title: 'hello', parent: {number:3}},
    {id: 8, title: 'hello', parent: {number:2}}
]
function getNestedChildren(arr, parent) {
    var children = [];
    for(var i =0; i < arr.length; ++i) {
        if(arr[i].parent.number == parent.number) {
            var grandChildren = getNestedChildren(arr, {number: arr[i].id})

            if(grandChildren.length) {
                arr[i].children = grandChildren;
            }
            children.push( arr[i]);
        }
    }
    return children;
}
var nest = getNestedChildren(array,{number: 0});
console.log( nest);

【讨论】:

  • @traktor53 - 如果您的阵列更平坦,如何解决这个问题?
  • 我无法在这里评论所有代码,所以我写了一个单独的答案。
【解决方案2】:

如果有人想根据 user992731 的要求了解扁平化初始数组的解决方案:

var array = [
    {id: 1, title: 'hello', parent: 0},
    {id: 2, title: 'hello', parent: 0},
    {id: 3, title: 'hello', parent: 1},
    {id: 4, title: 'hello', parent: 3},
    {id: 5, title: 'hello', parent: 4},
    {id: 6, title: 'hello', parent: 4}
];

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].id);
            if(grandChildren.length) {
                arr[i].children = grandChildren;
            }
            children.push(arr[i]);
        }
    }
    return children;
}
var nest = getNestedChildren(array,0);
console.log(nest);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2019-02-08
    • 2017-07-02
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多