Lodash或JS GroupBy和Count用于数组数组

时间:2016-11-14 16:52:31

标签: javascript lodash

我有一个输入:

results = [
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS1", "small", "SW192EZ", "undefined" ],
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined" ],
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined" ],
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "medium", "SW192EZ", "undefined" ],
]

我希望输出类似于

small
  DryKISS1 : 1
medium
  DryKISS2 : 1
large
  DryKISS1 : 5
  DryKISS2 : 2
  DryKISS3 : 1

基本上按大小分组,然后在相同大小的括号中汇总​​公司名称。

我一直在玩下面的游戏,但是因为大多数示例都是针对哈希/对象而迷路了

console.log _.chain( results ).groupBy( 4 ).map( ( value, key ) ->
  [
    key
    _.reduce( value, ( ( result, currentObject ) ->
      {
        company: result[ 3 ]
      }
    ))
  ]
).value()

任何帮助表示赞赏

2 个答案:

答案 0 :(得分:3)

按第4列分组,然后使用transform按第3列计算项目:

var data = [
  ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS1", "small", "SW192EZ", "undefined"],
  ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined"],
  ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined"],
  ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "medium", "SW192EZ", "undefined"],
];
  
var result = _(data)
  .groupBy(4)
  .transform(function(result, items, key) {
    result[key] = _.countBy(items, 3);
  })
  .value();
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.0/lodash.min.js"></script>

答案 1 :(得分:1)

在普通的Javascript中,您可以使用具有嵌套属性的对象进行计数。

&#13;
&#13;
var results = [["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS1", "small", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "medium", "SW192EZ", "undefined"]],
    grouped = {};

results.forEach(function (a) {
    grouped[a[4]] = grouped[a[4]] || {};
    grouped[a[4]][a[3]] = (grouped[a[4]][a[3]] || 0) + 1;
});

console.log(grouped);
&#13;
&#13;
&#13;

最大数量

&#13;
&#13;
var results = [["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS1", "small", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "ian.warner@drykiss.com", "DryKISS2", "medium", "SW192EZ", "undefined"]],
    grouped = {},
    max = { count: 0, keys: [] };

results.forEach(function (a) {
    grouped[a[4]] = grouped[a[4]] || {};
    grouped[a[4]][a[3]] = (grouped[a[4]][a[3]] || 0) + 1;
    if (grouped[a[4]][a[3]] > max.count) {
        max = { count: grouped[a[4]][a[3]], keys: [{ size: a[4], group: a[3] }] };
        return;
    }
    if (grouped[a[4]][a[3]] === max.count) {
        max.keys.push = { size: a[4], group: a[3] };
    }
});

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