Javascript 对对象数组中具有相同值的元素求和
我有这样一个数组:Javascript 对对象数组中具有相同值的元素求和,javascript,arrays,sorting,reduce,Javascript,Arrays,Sorting,Reduce,我有这样一个数组: [{ "x": 2020-06-27T11:26:00.000Z, "y": 499 }, { "x": 2020-06-27T11:30:00.000Z, "y": 21 }] 我想对每两小时间隔(x)内的y值求和。y值应组合为0-凌晨2点、凌晨2-4点、凌晨4-6点等间隔 到目前为止,我所做的是在同一个小时内对元素求和: var t={}; 未排序数据forEach((v)=>{ if(t
[{ "x": 2020-06-27T11:26:00.000Z, "y": 499 },
{ "x": 2020-06-27T11:30:00.000Z, "y": 21 }]
我想对每两小时间隔(x
)内的y
值求和。y
值应组合为0-凌晨2点、凌晨2-4点、凌晨4-6点等间隔
到目前为止,我所做的是在同一个小时内对元素求和:
var t={};
未排序数据forEach((v)=>{
if(t[v.x.getHours()){
t[v.x.getHours()]+=v.y;
}否则{
t[v.x.getHours()]=v.y;
}
});
未排序数据=t;
这会返回类似于:{“13:512”,“15:98..}
等等的结果
现在,这段代码有一些问题我不知道如何解决
首先,我如何让它以两小时的间隔工作,而不是以同样的时间检查?
还有什么方法可以获得完整日期而不是小时数的返回?我假设在原始数据中
x
属性有date
实例,因为您对这些值调用getHours()
您可以清除日期值中小时部分的最低有效位,以便将其截断为2的倍数。但是,请使用UTC***
方法,并将这些日期组件传递给date.UTC
方法,因为您的日期是用UTC字符串初始化的。这将为您提供一个Unix历元编号,您可以将其用作t
对象的属性(请考虑使用更有意义的名称)
但是,我会将完整的对象存储在那些t
属性中,以便最终可以提取对象值,并以与开始时完全相同的格式结束:
let unsortedData=[
{“x”:新日期(“2020-06-27T11:26:00.000Z”),“y”:499},
{“x”:新日期(“2020-06-27T11:30:00.000Z”),“y”:21},
{“x”:新日期(“2020-06-27T12:01:00.000Z”),“y”:15},
{“x”:新日期(“2020-06-27T13:59:00.000Z”),“y”:8},
{“x”:新日期(“2020-06-27T14:20:00.000Z”),“y”:30},
{“x”:新日期(“2020-06-27T14:25:00.000Z”),“y”:1},
];
设t={};
未排序数据forEach((v)=>{
设block=Date.UTC(
v、 x.getUTCFullYear(),
v、 x.getUTCMonth(),
v、 x.getUTCDate(),
v、 x.getUTCHours()&0xFE//忽略二进制文件的最后一位
);
if(t[块]){
t[block].y+=v.y;
}
其他的
t[block]={x:newdate(block),y:v.y};
});
设sortedData=Object.values(t);
控制台日志(sortedData)代码>所有值(y)都显示为整数。使用parseFloat()
的逻辑是什么?我还应该添加看起来是文字格式的。那么为什么需要解析呢?我想x
值是Date
对象?如果你想要完整的日期,那就需要对密钥进行字符串化,而且还不清楚2小时的间隔应该如何编码。您想要的确切结果结构是什么?谢谢你的澄清<代码>日期
不是基于浮点数的。@GetSet修复了这个问题。这是什么,为什么如果(t[v.x.getHours()])
?您没有显示所有代码。