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()
任何帮助表示赞赏
在普通的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; }
'我希望输出是像'',看起来不一样。 :)这很可能是他之后的事情,但如果OP的数据来源和预期的结果是可重复的,那将会很好。 – Keith
非常感谢 - 我试图找到一个loDash的方式,但这是一个简单的香草方法,应该使用我的感觉。 –
啊一个问题,我将如何排序这些数量是顶部? –
集团由第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>
很多thx我选择了下面的JS版本,但也给了你一个upvote。 –
你能解释一下更详细的你如何指望你提供的数据,成为您的预期产出,因为我没有看到它。对于初学者,我无法在您提供的数据中看到任何DryKISS3。也是你真实的电子邮件地址,如果是这样,你确实知道抓取者可以抓住这个,你会得到垃圾邮件.. :) – Keith