计算javascript对象上的类似属性

时间:2016-01-13 17:36:48

标签: javascript

我有一个像这样的对象数组:

[{"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都会越来越大。这看起来并不高效。

3 个答案:

答案 0 :(得分:2)

根据您对_.each的使用情况,您似乎正在使用LoDash或Underscore。在这种情况下,两个库都有一个方便的_.countBy方法(LoDash docsUnderscore 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);

注意:检查环境中的地图兼容性。