Underscore.js嵌套分组

时间:2014-08-13 20:43:50

标签: javascript underscore.js

我无法从以下json

获取我需要的输出
[
 {"Type":"A","Location":"1"},
 {"Type":"A","Location":"2"},
 {"Type":"A","Location":"3"},
 {"Type":"B","Location":"2"},
 {"Type":"B","Location":"3"},
 {"Type":"C","Location":"1"},
 {"Type":"A","Location":"1"},
 {"Type":"A","Location":"1"},
 {"Type":"A","Location":"3"},
 {"Type":"C","Location":"1"},
 {"Type":"C","Location":"1"},
 {"Type":"C","Location":"1"}
]

我的预期输出如下:

[
 {"Type":"A","Count":"6","Locations":
  [
   {"Location":"1","Count":"3"},
   {"Location":"2","Count":"1"},
   {"Location":"3","Count":"2"}
  ]
 },
 {"Type":"B","Count":"2","Locations":
  [
   {"Location":"2","Count":"1"},
   {"Location":"3","Count":"1"}
  ]
 },
 {"Type":"C","Count":"4","Locations":
  [
   {"Location":"1","Count":"4"}
  ]
 }
]

我到目前为止的代码会对位置进行分组并给我计数,但我仍然坚持使用内部组

var result = _.chain($scope.incidents)
                    .groupBy("Type")
                    .map(function(value,key){
                        return{
                            Type:key,
                            Count:value.length
                        }
                    }).value();

2 个答案:

答案 0 :(得分:2)

我假设您正在使用Lo-Dash,因为下划线似乎没有groupBy(<string>)功能。

无论如何,这是一个解决方案:

var result = _(list)
    .groupBy('Type')
    .map(function (locations, type) {
        return {
            Type: type,
            Count: locations.length,
            Locations: _(locations)
                .groupBy('Location')
                .map(function (arr, location) {
                    return {
                        Count: arr.length,
                        Location: location
                    };
                }).value()
        };
    }).value();

答案 1 :(得分:2)

试试这个:

var result = _.chain($scope.incidents).groupBy('Type').map(function(value, key) {
  return {
    Count: value.length,
    Type: key,
    Locations: _.chain(value).groupBy('Location').map(function(value, key) {
      return {
        Location: key,
        Count: value.length
      };
    }).value()
  };
}).value();