Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将毫秒数据分组为一组日期_Javascript_Date - Fatal编程技术网

Javascript 将毫秒数据分组为一组日期

Javascript 将毫秒数据分组为一组日期,javascript,date,Javascript,Date,我有一个类似这样的想法 { 1489330777089: 100, // 12 March 1489330824346: 45, // 12 March 1489330877089: 90, // 13 March 1489330824346: 120, // 13 March ..... } 键是在创建时从Date.now()开始的,值是一个整数 我想把这些数据绘制成图表,比如以日期为x轴的条形图 如何使用Javascript将这些数据分组为日期,

我有一个类似这样的想法

{
    1489330777089: 100, // 12 March
    1489330824346: 45,  // 12 March
    1489330877089: 90,  // 13 March
    1489330824346: 120, // 13 March
    .....
}
键是在创建时从
Date.now()
开始的,值是一个整数

我想把这些数据绘制成图表,比如以日期为x轴的条形图

如何使用Javascript将这些数据分组为日期,并将整数值相加。预期结果是:

{
    12 March 2017: 145 // 100 + 45
    13 March 2017: 210 // 90 + 120
    ...
} 
(如果需要注意的话,我正在使用这个Internal React应用程序。另外,使用Firebase存储数据)


谢谢

这将遍历这些值,截短它们直到一天,并使用分组值的总和生成输出

let source = {
    1489330777089: 100,
    1489330824346: 45, 
    1489330877089: 90, 
    1489330824346: 120,
}

let grouped = Object.keys(source).reduce((output, key) => {
  let date = new Date(Number(key)),
      groupedDate = new Date(date.getFullYear(), date.getMonth(), date.getDay());

  if (typeof output[groupedDate] === 'undefined') output[groupedDate] = 0;

  output[groupedDate] += source[key];

  return output;
}, {});

您可能希望更改输出属性字符串/运算符/截断单位,但通过对上述代码进行细微更改,这应该很容易。

您可以使用ISO日期进行分组。也许你需要在正确的当地时间使用ofsett

var数据={148933077089:1001489330824346:451489330877089:901489330824346:120},
分组={};
Object.keys(数据).forEach(函数(k){
变量日期=(新日期(+k+1000*60*60*24)).toISOString().slice(0,10);
分组[日期]=分组[日期]| | 0;
分组[日期]+=数据[k];
});
控制台日志(分组)您可以这样做

{
    1489330777089: 100, // 12 March
    1489330824346: 45,  // 12 March
    1489330877089: 90,  // 13 March
    1489330824346: 120, // 13 March
    .....
}
var date\u obj={
148933077089:100//3月12日
1489330824346:45,//3月12日
1489330877089: 90
}
var tempData={};
对于(日期为的var指数){
如果(日期对象[索引]!=“未定义”){
var milisec=parseInt(索引);
var get_数据=新日期(毫秒);
var str_date=get_data.toString();
var-date\u-str=str\u-date.substr(0,15);
if(typeof(tempData[date\u str])=“未定义”){
tempData[date_str]=parseInt(date_obj[index]);
}否则{
tempData[date_str]=tempData[date_str]+parseInt(date_obj[index]);
}
} 
}
数据=临时数据;

控制台日志(数据)
您可以使用
var Date=新日期(毫秒)获取
日期
。使用
date.toString()
可以获得一个可读的日期字符串。只要把它放到一个循环中,你的问题就完成了。@SchokokuchenBäcker对不起,我更新了这个问题以使它更清楚。我不仅想将毫秒转换为日期,我还想将具有相同日期的毫秒分组为一个。同时求和整数值。请注意,由于时区的影响,这些时间值可能表示不同时区中的不同日期。对我来说,所有4个时间值都在3月13日。您想在特定时区比较它们吗?这与非常相似。您的对象文字无效,有两个“1489330824346”属性,因此值45被90覆盖。@RobG Yep,我上面的示例数据实际上不是对应于这些日期的实际毫秒。我只是想更好地说明我的问题。抱歉,如果这对我来说是误导,那么输出是
{“2017-03-13”:310}
。也许应该考虑时区?这个值应该是355,所以其他的东西也会出错。是的,但是哪一个呢?;-)我不知道。这取决于op的当地时区。谢谢!与@smnbbrv提供的答案相比,使用此选项有什么优势吗?谢谢!这太棒了。与Nina Scholz提供的方法相比,使用您的方法有什么优势吗?这不考虑时区。所有这些时间值都在同一天,所以对我来说,结果是
{Wed Mar 01 2017 00:00:00 GMT+1000:310}
@RobG我现在不担心时区。另外,我上面的样本数据并不是对应于这些日期的真正毫秒。但你是对的。在性能比较方面,我也想知道:)@GaddafiRusli,但你必须担心时区,因为时区将决定这些值所代表的日期。在UTC中查看,它们都在3月12日。在我的时区,它们都是3月13日。因此,您将根据执行代码的主机的时区设置获得不同的结果。如果解决方案不能给出正确的结果,那么性能是无关紧要的。对于全局变量使用let也没有多大意义,它极大地限制了兼容性,但没有任何好处。