Javascript 循环遍历对象并添加日期范围内的所有值

Javascript 循环遍历对象并添加日期范围内的所有值,javascript,for-loop,Javascript,For Loop,我有一个查询,它为用户获取过去7天的值。这些条目可能是(2)或(20)。重要的是计算并添加每个日期的值 以下是数据: [ { calories: '1170.00', upload_date: 2019-12-31T21:41:42.943Z }, { calories: '2188.00', upload_date: 2019-12-31T21:41:56.604Z }, { calories: '1079.00', upload_date: 2019-12-31T21:43:06.3

我有一个查询,它为用户获取过去7天的值。这些条目可能是(2)或(20)。重要的是计算并添加每个日期的值

以下是数据:

[ { calories: '1170.00', upload_date: 2019-12-31T21:41:42.943Z },
  { calories: '2188.00', upload_date: 2019-12-31T21:41:56.604Z },
  { calories: '1079.00', upload_date: 2019-12-31T21:43:06.372Z },
  { calories: '2188.00', upload_date: 2019-12-31T21:42:56.577Z },
  { calories: '445.00', upload_date: 2019-12-31T21:42:45.559Z },
  { calories: '1170.00', upload_date: 2019-12-31T21:42:28.609Z },
  { calories: '445.00', upload_date: 2019-12-31T21:42:15.793Z },
  { calories: '1079.00', upload_date: 2019-12-31T21:42:05.049Z } ]
现在在这个例子中,上传日期是相同的,这很好,但它应该返回的是 {卡路里:总计,上传日期:“2019-12-31”}如果这里有七天,我需要总共七个条目

我所尝试的:

我尝试过使用Date对象和一些数组过滤的几种变体,但我没有得到满意的结果,我想从这里得到更好的方法


需要有一个循环,对对象中所有键的日期对象进行比较,如果它们相等,则将(+=)添加到该特定日期的总和;然后,如果有更多条目,则继续并重复,直到添加了所有对象值,并考虑到日期。

您可以使用.reduce函数添加数组中的每个元素

array.reduce((acc, el) => {}, {});
其中,
el
是原始数组的元素

现在,使用.reduce中使用的累加器,可以将此对象的键设置为日期字符串,重要的是不包括时间。一种方法是通过
newdate()给出类似于2020年1月3日星期五的内容

var reduced = array.reduce((acc, el) => {
    let newKey = new Date(el.upload_date).toDateString();
    if (acc[newKey]) {
        acc[newKey] += Number(el.calories);
    } else {
        acc[newKey] = Number(el.calories);
    }
    return acc;
}, {});
现在您的“简化”对象应该看起来像
{'Fri Jan 03 2020':300,'Sat Jan 04 2020':324,}

for(let i=7; i>=0; i--) {
   let day = new Date(Date.now() - (86400000 * i));
   let counts = data.filter(d => sameDay(day, d.upload_date));
   let caloriesOfThisDay = 0;
   counts.forEach(count => caloriesOfThisDay += count.calories);
   let dataOfThisDay = { colories: coloriesOfThisDay, upload_date: day };
}
function sameDay(d1, d2) {
    return d1.getFullYear() === d2.getFullYear() &&
      d1.getMonth() === d2.getMonth() &&
      d1.getDate() === d2.getDate();
}
首先,它计算它正在检查的日期,然后过滤它是否在检查的当天

之后,它会检查所有卡路里并生成您需要的数据对象。

const input=[{卡路里:'1170.00',上传日期:'2019-12-31T21:41:42.943Z'},
{卡路里:'2188.00',上传日期:'2019-12-31T21:41:56.604Z'},
{卡路里:'1079.00',上传日期:'2019-12-31T21:43:06.372Z'},
{卡路里:'2188.00',上传日期:'2019-12-31T21:42:56.577Z'},
{卡路里:'445.00',上传日期:'2019-12-31T21:42:45.559Z'},
{卡路里:'1170.00',上传日期:'2019-12-31T21:42:28.609Z'},
{卡路里:'445.00',上传日期:'2019-12-31T21:42:15.793Z'},
{卡路里:'1079.00',上传日期:'2019-12-31T21:42:05.049Z'},
{卡路里:'1079.00',上传日期:'2019-12-30T21:42:05.049Z'}//为演示添加
]
常量输出=输入。减少((全部,下一个)=>{
const s=新日期(下一个上载日期)
常量键=`${s.getFullYear()}-${(s.getUTCMonth()+1)}-${s.getUTCDate()}`
const exist=all.find(v=>v.upload\u date==key)
如果(存在){
exist.carries+=数字(next.carries)
}否则{
好的,推({
卡路里:数字(下一个是卡路里),
上传日期:key
})
}
全部归还
}, [])  

console.log(输出)
如果要按特定日期求和,可以执行以下操作:

const test=[{卡路里:'1170.00',上传日期:'2019-12-31T21:41:42.943Z},
{卡路里:'2188.00',上传日期:'2019-12-31T21:41:56.604Z'},
{卡路里:'1079.00',上传日期:'2019-12-31T21:43:06.372Z'},
{卡路里:'2188.00',上传日期:'2019-12-31T21:42:56.577Z'},
{卡路里:'445.00',上传日期:'2019-12-31T21:42:45.559Z'},
{卡路里:'1170.00',上传日期:'2019-12-31T21:42:28.609Z'},
{卡路里:'445.00',上传日期:'2019-12-31T21:42:15.793Z'},
{卡路里:'1079.00',上传日期:'2019-12-31T21:42:05.049Z}];
常量filterDataByDate=(日期)=>test.filter(项=>{
const uploadDate=新日期(项目上传日期);
const formattedUploadDate=uploadDate.getFullYear()+'-'+(uploadDate.getMonth()+1)+'-'+uploadDate.getDate();
//日志(日期,formattedUploadDate,日期===formattedUploadDate);
返回日期===formattedUploadDate;
});
const sumOfCalories=filterDataByDate('2019-12-31')。reduce((累加器,当前值)=>{
返回累加器+=数量(当前值.卡路里);
}, 0);

console.log(“热量总和:”,热量总和)我喜欢这个,它紧凑、优雅,并且非常好地使用javascript。