如何按年分组日期数组并减去最后一个值-第一个值?



我有一个日期数组,我想按年对日期进行分组,并减去最后一个值-第一个值。例如,我有以下数组:

const data = [
{ x: "2021-10-17T14:38:45.540Z", y: 2 },
{ x: "2021-10-17T13:38:45.540Z", y: 2 },
{ x: "2021-09-16T14:36:46.540Z", y: 1 },
{ x: "2021-01-04T14:35:46.540Z", y: 2 },
{ x: "2021-01-01T14:30:46.540Z", y: 1 },
{ x: "2020-02-01T06:28:47.520Z", y: 12 },
{ x: "2020-02-01T07:28:47.520Z", y: 12 },
{ x: "2019-04-13T10:19:20.034Z", y: 20 },
{ x: "2018-01-01T09:09:19.134Z", y: 4 },
{ x: "2017-01-01T12:09:19.034Z", y: 11 },
{ x: "2016-01-02T12:10:20.034Z", y: 24 },
{ x: "2016-01-02T11:10:20.034Z", y: 14 }
];

这是我尝试的按年分组对象数组并减去最后一个值-第一个值

我得到了如下结果:

[
{
"value": 8,
"label": "2021"
},
{
"value": 24,
"label": "2020"
},
{
"value": 20,
"label": "2019"
},
{
"value": 4,
"label": "2018"
},
{
"value": 11,
"label": "2017"
},
{
"value": 38,
"label": "2016"
}
]

年度预期输出(value =上一个值-第一个值):

[
{
"value": 1,
"label": "2021"
},
{
"value": 0,
"label": "2020"
},
{
"value": 20,
"label": "2019"
},
{
"value": 4,
"label": "2018"
},
{
"value": 11,
"label": "2017"
},
{
"value": 10,
"label": "2016"
}
]

这是按年分组函数:

function group_by_year(arr) {
return Object.values(
arr.reduce((a, { x: date_string, y: value }) => {
const { year } = get_date_parts(date_string);
if (a[year] === undefined) {
a[year] = { value: 0, label: year };
}
a[year].value += value; // the problem (lastValue - firstValue)
return a;
}, {})
);
}

问题是如何将这一行a[year].value += value;改为a[year].value = lastValue - firstValue;

在累加器内部,您只是从数组中添加值。这将产生一年的总价值。

我使用了下面的逻辑。

  • 保持firstValue,lastValue,labeloccurance每年相对。
  • firstValue保存该年份的第一个出现值。
  • lastValue保存该年份的最后一次出现值。
  • label年值
  • 数组中每年occurance的计数。

Array.reduce获得的累积结果中,运行Array.map以生成所需的输出。它将是lastValue - firstValue。使用数学。如果你对正差感兴趣,只需要不带符号的Abs

工作小提琴

const data = [{ x: "2021-10-17T14:38:45.540Z", y: 2 },{ x: "2021-10-17T13:38:45.540Z", y: 2 },{ x: "2021-09-16T14:36:46.540Z", y: 1 },{ x: "2021-01-04T14:35:46.540Z", y: 2 },{ x: "2021-01-01T14:30:46.540Z", y: 1 },{ x: "2020-02-01T06:28:47.520Z", y: 12 },{ x: "2020-02-01T07:28:47.520Z", y: 12 },{ x: "2019-04-13T10:19:20.034Z", y: 20 },{ x: "2018-01-01T09:09:19.134Z", y: 4 },{ x: "2017-01-01T12:09:19.034Z", y: 11 },{ x: "2016-01-02T12:10:20.034Z", y: 24 },{ x: "2016-01-02T11:10:20.034Z", y: 14 }];
function get_date_parts(iso_string) {
const [year, month, day, hr, min, sec] = iso_string.split(/D/g);
return { year, month, day, hr, min, sec };
}
function group_by_year(arr) {
const grouppedYear = Object.values(
arr.reduce((a, { x: date_string, y: value }) => {
const { year } = get_date_parts(date_string);
if (a[year] === undefined) {
a[year] = {
firstValue: value,
lastValue: value,
label: year,
occurance: 1,
};
} else {
a[year].lastValue = value;
++a[year].occurance;
}
return a;
}, {})
);
const returnValue = grouppedYear.map(({firstValue, lastValue, label, occurance}) => ({value: occurance > 1 ? lastValue - firstValue : firstValue, label}))
return returnValue;
}
const output = group_by_year(data);
console.log(output)

使用moment库可以将日期字符串提取为年份moment("2021-10-17T14:38:45.540Z").format('YYYY')在准备好数组对象后,您可以简单地对数组进行排序并找到答案

在这里你需要为同一年的数据创建单独的数组组然后在for循环

中找到第一和最后一个索引

最新更新