Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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_Arrays_Sorting_Reduce - Fatal编程技术网

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()])
?您没有显示所有代码。