【问题标题】:How to get the sum of values per day grouped by day from an array in JS? [closed]如何从JS中的数组中获取每天按天分组的值的总和? [关闭]
【发布时间】:2018-05-10 00:08:53
【问题描述】:

在 JS 中,给定一个对象数组,例如:

    [{
      date: 1525655429184,
      value: 20.00
    },{
      date: 1525655429184,
      value: 3.99
    },{
      date: 1526001029184,
      value: 19.00
    },{
      date: 1526001025184,
      value: 4.30
    }]

其中 'date' 属性是以毫秒为单位的日期,而 'value' 属性是由浮点数表示的货币,并且此数组的每个对象都可以是一个月中的某一天及其相关值。

我想获取每个工作日的 value 总和,以显示在 x 天的总值图表中。

所以输出应该是这个例子:

    [
      { day: 'Sun', sum: 23.99 },
      { day: 'Mon', sum: 0 },
      { day: 'Tue', sum: 22.2 },    
      { day: 'Wed', sum: 22.3 },    
      { day: 'Thu', sum: 2.2 },    
      { day: 'Fri', sum: 32.2 },    
      { day: 'Sat', sum: 22.43 },    
    ]

【问题讨论】:

  • 请展示一些示例数据和您的尝试
  • 添加了输入输出示例
  • 这些值似乎是时间值,其中一个时间值可能代表不同时区的不同日期。一切都应该被视为UTC吗?还是调整到某个特定的时区?

标签: javascript arrays date grouping milliseconds


【解决方案1】:

首先,您需要将date(我相信以毫秒为单位)转换为日期并使用getDay() 获取日期。创建一个天数组,循环遍历天数,如果转换后的日期与天数相同,则将值相加。看看下面的sn-p。

var data = [{
  date: 1525655429184,
  value: 20.00
}, {
  date: 1525655429184,
  value: 3.99
}, {
  date: 1526001029184,
  value: 19.00
}, {
  date: 1526001025184,
  value: 4.30
}]
var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var sumVals = [];
var daysSum = [];

var sumVal = days.forEach(function(day) {
  var total = 0;
  data.forEach(function(items) {
    var d = new Date(items.date);
    var formattedD = days[d.getDay()];
    if (day === formattedD) {
      total += parseFloat(items.value);
    }
  })
  sumVals.push(total)
	daysSum.push([day, total])
})
console.log(days)
console.log(sumVals)
console.log(daysSum)//just to show if it matches

【讨论】:

  • 但是一天可能会因时区而异,例如1525910400000 是 2018-05-10T00:00:00.000Z,这是星期四,但在纽约 (UTC -4) 仍然是星期三。
  • 这个答案部分解决了,因为可能有几十天或几百天的数据,这个答案不能解决这个问题。
  • @JosielFaleiros 它实际上会将同一天的所有值相加。
  • @SachiTekina 是的,它确实将所有按天分组的值相加,但数据可能有数十天或数百天,答案不适用于此,这就是我的情况,对不起,如果我没有'解释不清楚
【解决方案2】:

一天中的毫秒数:

var millsperday = 1000*60*60*24;

当前毫秒/天偏移量:

var d = new Date();
var m = d.getTime(); 
d.setHours(0,0,0,0);
var o = d.getTime()-m;

所以,划分(unixtime)毫秒的列表:

for (i=0;i<list.length;i++) {
  numberofday = Math.floor((list[i]-o)/millsperday) ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2015-09-11
    • 2017-07-07
    • 1970-01-01
    • 2019-01-14
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多