【问题标题】:How to convert nested set into nested array in javascript?如何在javascript中将嵌套集转换为嵌套数组?
【发布时间】:2018-06-06 17:55:51
【问题描述】:

有以下数据。

[
    {"no":1, "name":"ELECTRONICS", "depth":0},
    {"no":2, "name":"TELEVISIONS", "depth":1},
    {"no":3, "name":"TUBE", "depth":2},
    {"no":4, "name":"LCD", "depth":2},
    {"no":5, "name":"PLASMA", "depth":2},
    {"no":6, "name":"PORTABLE ELECTRONICS", "depth":1},
    {"no":7, "name":"MP3 PLAYERS", "depth":2},
    {"no":8, "name":"FLASH", "depth":3},
    {"no":9, "name":"CD PLAYERS", "depth":2},
    {"no":10, "name":"2 WAY RADIOS", "depth":2}
]

我想得到如下数据。

[
    {
        "no":1,
        "name":"ELECTRONICS",
        "depth":0,
        "child_nodes":[
            {
                "no":2,
                "name":"TELEVISIONS",
                "depth":1
                "child_nodes":[
                    {
                        "no":3,
                        "name":"TUBE",
                        "depth":2
                    },
                    ...
                ]
            },
            {
                "no":6,
                "name":"PORTABLE ELECTRONICS",
                "depth":1
                "child_nodes":[ ... ]
            }
        ]
    }
]

我正在递归地尝试它,但它并不好。由于我使用的是 babel,所以对 javascript 的新功能没有太大的限制。如果你有一个好主意,请告诉我。谢谢!

【问题讨论】:

  • 应该将depth 关联到特定的parent

标签: javascript arrays multidimensional-array depth nested-sets


【解决方案1】:

您可以为关卡使用辅助数组。

var array = [{ no: 1, name: "ELECTRONICS", depth: 0 }, { no: 2, name: "TELEVISIONS", depth: 1 }, { no: 3, name: "TUBE", depth: 2 }, { no: 4, name: "LCD", depth: 2 }, { no: 5, name: "PLASMA", depth: 2 }, { no: 6, name: "PORTABLE ELECTRONICS", depth: 1 }, { no: 7, name: "MP3 PLAYERS", depth: 2 }, { no: 8, name: "FLASH", depth: 3 }, { no: 9, name: "CD PLAYERS", depth: 2 }, { no: 10, name: "2 WAY RADIOS", depth: 2 }],
    result = [],
    levels = [{ children: result }];

array.forEach(function (o) {
    levels[o.depth].children = levels[o.depth].children || [];
    levels[o.depth].children.push(levels[o.depth + 1] = o);
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 这非常简单。这简直太棒了。
  • 好主意!非常感谢。
【解决方案2】:
//The trees root = our expected result  
 const result = [];
 var acc  = { depth: -1, children: result};

 for(const el of data){
   //walk upwards in the tree
   var up = acc.depth - el.depth + 1 ;
   while(up--){ acc = acc.parent }
   //walk down and add the current el as a child
   el.parent = acc;
   (acc.children || (acc.children = [])).push(el);
   acc = el;
}

console.log(result);

您可以穿过一棵树 (acc) 并将父母/孩子联系在一起。

【讨论】:

  • 帮助很大。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2019-10-12
  • 2015-09-20
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多