下划线递归groupBy字符串数组的数组

3

我想要将一个只包含字符串的扁平化数组和一个数组组合并分组。

我的数组看起来像这样:

var array = [
    ["MotherNode", "Node1", "ChildNode1", "ChildOfChildNode1"],
    ["MotherNode", "Node1", "ChildNode2", "ChildOfChildNode2"],
    ["MotherNode", "Node2", "ChildNode3", "ChildOfChildNode3"],
    ["MotherNode", "Node2", "ChildNode3", "ChildOfChildNode4"],
    ["MotherNode", "Node3", "ChildNode4", "ChildOfChildNode5"],
    ["MotherNode", "Node3", "ChildNode4", "ChildOfChildNode5"]
]

我正在使用JavaScript / AngularJS进行操作,到目前为止,我已经确定最佳解决方案可能是使用underscore.js的groupBy/combine方法。然而,我能找到的大多数示例都是处理对象数组,它们可以使用值的键将它们组合在一起。而我还不够熟练,无法自己解决这个问题。

我正在处理的数组可能有数百个值,结果数组可能会有5-10层深度。

通过解析上面的数组,我想要的结果大致如下:

var result= {
    "MotherNode": [{
        "Node1":[{
            "ChildNode1":"ChildOfChildNode1"
            },{
            "ChildNode2":"ChildOfChildNode2"
        },{
        "Node2":[{
            "ChildNode3":["ChildOfChildNode3","ChildOfChildNode4"]
        },{
        "Node3":[{
            "ChildNode4":"ChildOfChildNode5"
        }
    ]
}

有没有人知道如何实现这个?我完全没有任何想法。


可能是Underscore.js groupBy multiple values的重复问题。 - Bergi
你的语法有问题。你的array不能有索引,而且你的result中最内层的对象没有任何键。 - Bergi
为什么您的结果会包含许多仅包含单个对象的数组? - Bergi
这正是我想象中只有一个子节点时的结果。由于太多值会很快变得难以理解,所以我不想在示例中过于复杂化。我会修复语法。 - grimurd
在我创建这个问题之前,我查看了https://dev59.com/Emkw5IYBdhLWcg3wQoWm。那里和这里的不同之处在于那个问题处理具有键的对象,因此可以通过使用它们轻松地对它们进行分组。我的问题是没有键,必须根据值进行分组。 - grimurd
每个数组都是一个对象并有键。您可以很容易地执行 _.groupByMulti(array, [0, 1, 2])。也许可以添加一个额外的回调函数,将最内层的值映射到您想要的数组。 - Bergi
1个回答

2

我使用了 _.reduce 来解决这个问题,分组不是解决方法。

   var result = _.reduce(array,function(memo, val){ 
        var tmp = memo;
            _.each(val, function(fldr){
                if(!_.has(tmp, fldr)){
                    tmp[fldr] = {}
                }
                tmp = tmp[fldr]
            })

        return memo
    },{})

最终节点不会被设置为值,但可以轻松更改该行为以适应您的用例需求。

{ MotherNode: 
   { Node1: 
      { ChildNode1: { ChildOfChildNode1: {} },
        ChildNode2: { ChildOfChildNode2: {} } },
     Node2: { ChildNode3: { ChildOfChildNode3: {}, ChildOfChildNode4: {} } },
     Node3: { ChildNode4: { ChildOfChildNode5: {} } } } }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接