我认为您不需要使用node.js/JS库来完成此任务。您想要实现的目标可以通过使用reduce函数来完成。
var a = [{
"time": "28-09-2018 21:29:04",
"value1": 1280,
"value2": 800
},
{
"time": "28-09-2018 21:38:56",
"value1": 600,
"value2": 700
},
{
"time": "29-09-2018 10:40:00",
"value1": 1100,
"value2": 300
},
{
"time": "29-09-2018 23:50:48",
"value1": 140
}];
var b = Object.values(a.reduce((container, current) => {
var date = current['time'].substring(0, 10);
if (!container[date])
container[date] = {time: date + ' 00:00:00', value1: current['value1'] || 0, value2: current['value2'] || 0};
else {
container[date]['value1'] += current['value1'] || 0;
container[date]['value2'] += current['value2'] || 0;
}
return container;
}, {}));
该函数创建一个以日期为键并聚合数值的对象。需要注意在该对象中日期是否存在。使用
|| 0
可以处理属性不在元素中的情况,防止出现错误;使用
Object.values
提取值以获得数组。由于你将日期用作字符串,我将它们视为字符串处理。如果它们是日期对象,则需要调整声明
date
的常规部分。
顺便提一下,像往常一样,您可以使用
['value1']
或
.value1
在js中引用prop。我坚持使用更熟悉的Python语法,因为已经提到过。
当然,这只是一个每日重新采样的例子,如果您需要更大/更小的配额,则必须处理日期。假设我们想模拟12小时重新采样,那么您可以编写:
var resample = 12;
var b = Object.values(a.reduce((container, current) => {
var date = new Date(current['time'].replace(/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/, '$3-$2-$1T$4:$5:$6'));
date.setHours(Math.floor(date.getHours() / resample) * resample);
date.setMinutes(0);
date.setSeconds(0);
if (!container[date.toString()])
container[date.toString()] = {time: date, value1: current['value1'] || 0, value2: current['value2'] || 0};
else {
container[date.toString()]['value1'] += current['value1'] || 0;
container[date.toString()]['value2'] += current['value2'] || 0;
}
return container;
}, {}));
那个正则表达式
replace
是因为日期不是ISO格式,你可以使用库来处理,比如说
moment或者其他的库,我只是想展示一下仅用普通JS也是可以完成的。
在使用JS日期时,请记住一件事情:如果您正在使用浏览器,则时区为客户端的时区;如果您在服务器上,则时区与服务器相同。如果
time
是没有时区限制的,那么在本地时区中管理所有内容应该没有问题。