【问题标题】:Underscore recursive groupBy array of string arrays下划线递归 groupBy 字符串数组数组
【发布时间】:2014-06-24 20:17:17
【问题描述】:

我正在尝试将一个数组与一堆仅包含字符串而不包含对象的平面数组组合和分组。

所以我的数组看起来像这样:

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"
        }
    ]
}

那么有没有人知道如何做到这一点?我完全没有想法。

【问题讨论】:

  • 你的语法错了。你的array 不能有索引,你的result 最里面的对象没有任何键。
  • 为什么你的结果会包含这么多只包含一个对象的数组?
  • 这正是我想象中只有一个子节点的结果。不想通过具有太多值使示例过度复杂化,因为它会很快变得难以理解。我会修正语法。
  • 我在创建这个问题之前检查了http://stackoverflow.com/q/10022156/1048572。这里和那里的不同之处在于,问题是使用键处理对象,因此可以通过使用它们轻松地对它们进行分组。我的问题是没有键,我必须按值分组。

标签: javascript arrays angularjs recursion underscore.js


【解决方案1】:

我使用 _.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: {} } } } }

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2017-12-20
    相关资源
    最近更新 更多