我有一个像这样的对象数组:
[{"ts":"Thu, 20 Aug 2015 18:00:00 GMT"},
{"ts":"Thu, 20 Aug 2015 17:00:00 GMT"},
{"ts":"Thu, 20 Aug 2015 16:00:00 GMT"},
{"ts":"Thu, 20 Aug 2015 15:00:00 GMT"},
{"ts":"Wed, 19 Aug 2015 16:00:00 GMT"},
{"ts":"Wed, 19 Aug 2015 15:00:00 GMT"}]
我每次都使用这样的东西遍历:
_.each(times,function(t){
console.log(t.ts);
}, this);
我正在使用moment
来确保所有日期都具有相同的日期结束时间,以便忽略此变量。我想创建一个具有相似次数的新对象,例如
uniqueTimes =
{
{"Thu, 20 Aug 2015": 4},
{"Wed, 19 Aug 2015": 2}
}
有关如何执行此操作的任何建议?我在考虑遍历uniqueTimes
函数中的_.each
对象,但我有数百次,因此每次迭代uniqueTimes
都会越来越大。这看起来并不高效。
答案 0 :(得分:2)
根据您对_.each
的使用情况,您似乎正在使用LoDash或Underscore。在这种情况下,两个库都有一个方便的_.countBy
方法(LoDash docs,Underscore docs),可以让您获得所需的结果,如下所示。
我可以使用adeneo shared的正则表达式方法,而不是我正在使用的整个拆分/连接方法。
var times = [{"ts":"Thu, 20 Aug 2015 18:00:00 GMT"},
{"ts":"Thu, 20 Aug 2015 17:00:00 GMT"},
{"ts":"Thu, 20 Aug 2015 16:00:00 GMT"},
{"ts":"Thu, 20 Aug 2015 15:00:00 GMT"},
{"ts":"Wed, 19 Aug 2015 16:00:00 GMT"},
{"ts":"Wed, 19 Aug 2015 15:00:00 GMT"}];
var groupedCounts = _.countBy(times, function(item) {
var split = item.ts.split(' ');
var value = split.slice(0, split.length - 2).join(' ');
return value;
});
document.body.innerHTML = '<pre>' + JSON.stringify(groupedCounts, null, 2) + '</pre>';
<script src="https://cdn.rawgit.com/lodash/lodash/3.0.1/lodash.min.js"></script>
答案 1 :(得分:1)
你可以随时迭代并添加到独特的时间
sealed trait ...
答案 2 :(得分:1)
使用ES6,您可以使用Map()数据结构完成任务:
const result = data.reduce((m, i) => {
const key = i.ts; // or format your date with moment
return m.set(key, m.has(key) ? m.get(key) + 1 : 1);
}, new Map());
console.log(result);
注意:检查环境中的地图兼容性。