Lodash或JS的GroupBy和Count为数组的数组

问题描述:

我有一个输入:Lodash或JS的GroupBy和Count为数组的数组

results = [ 
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS1", "small", "SW192EZ", "undefined" ], 
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined" ], 
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined" ], 
    [ "Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "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() 

任何帮助表示赞赏

+0

你能解释一下更详细的你如何指望你提供的数据,成为您的预期产出,因为我没有看到它。对于初学者,我无法在您提供的数据中看到任何DryKISS3。也是你真实的电子邮件地址,如果是这样,你确实知道抓取者可以抓住这个,你会得到垃圾邮件.. :) – Keith

在普通的JavaScript,你可以使用一个对象嵌套计数属性。

var results = [["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS1", "small", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "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);

,最大计数

var results = [["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS1", "small", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined"], ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

'我希望输出是像'',看起来不一样。 :)这很可能是他之后的事情,但如果OP的数据来源和预期的结果是可重复的,那将会很好。 – Keith

+0

非常感谢 - 我试图找到一个loDash的方式,但这是一个简单的香草方法,应该使用我的感觉。 –

+0

啊一个问题,我将如何排序这些数量是顶部? –

集团由第4列,则用变换数由第三列中的项目:

var data = [ 
 
    ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS1", "small", "SW192EZ", "undefined"], 
 
    ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined"], 
 
    ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "DryKISS2", "large", "SW192EZ", "undefined"], 
 
    ["Mon Nov 14 08:08:14 GMT+07:00 2016", "Ian Warner", "[email protected]", "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>

+0

很多thx我选择了下面的JS版本,但也给了你一个upvote。 –