计算javascript对象上的类似属性
我有这样一个对象数组:计算javascript对象上的类似属性,javascript,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"
[{"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
对象。每个函数都有数百次,因此每次迭代uniqueTimes
都会越来越大。这似乎效率不高 您可以在运行时迭代并添加到唯一时间
var时间=[
{“ts”:“2015年8月20日星期四格林威治标准时间18:00:00”},
{“ts”:“2015年8月20日星期四格林威治标准时间17:00:00”},
{“ts”:“2015年8月20日星期四格林威治标准时间16:00:00”},
{“ts”:“2015年8月20日星期四格林威治标准时间15:00:00”},
{“ts”:“2015年8月19日星期三格林威治标准时间16:00:00”},
{“ts”:“2015年8月19日星期三格林威治标准时间15:00:00”}
];
var uniqueTimes={};
times.forEach(函数(时间){
var t=(time.ts.match(/^(.*)\s\d+\:/)| |[])[1];
在uniqueTimes中的t?uniqueTimes[t]++:uniqueTimes[t]=1;
});
document.body.innerHTML=''+JSON.stringify(uniqueTimes,null,4)+''代码>使用ES6,您可以为任务使用数据结构:
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);
注意:检查您环境中的地图兼容性。根据您对的使用情况。每个似乎都在使用LoDash或下划线。在这种情况下,这两个库都有一个方便的..countBy
方法(,),可以让您获得所需的结果,如下所示
除了我正在使用的整个拆分/联接方法之外,还可以使用regex方法
var times=[{“ts”:“Thu,2015年8月20日18:00:00 GMT”},
{“ts”:“2015年8月20日星期四格林威治标准时间17:00:00”},
{“ts”:“2015年8月20日星期四格林威治标准时间16:00:00”},
{“ts”:“2015年8月20日星期四格林威治标准时间15:00:00”},
{“ts”:“2015年8月19日星期三格林威治标准时间16:00:00”},
{“ts”:“2015年8月19日星期三格林威治标准时间15:00:00”});
var groupedCounts=u0.countBy(时间、函数(项){
var分割=项目分割(“”);
var值=split.slice(0,split.length-2).join(“”);
返回值;
});
document.body.innerHTML=''+JSON.stringify(groupedCounts,null,2)+''代码>
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);
是的,你是对的,我是新手,所以我只是在学习工具。感谢您指出。.countBy
。这给了我一个好主意,如何继续处理绘制这些数据的问题,到目前为止,我已经得到了很好的结果。