我有日期陣列,我想按年份對日期進行分組并減去最后一個值 - 第一個值。例如,我有以下陣列:
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": 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;
uj5u.com熱心網友回復:
在累加器內部,您只是添加陣列中的值。這將產生一年的總價值。
我使用了以下邏輯。
- 保持
firstValue,lastValue,label和occurance反對每年。 firstValue保存那一年的第一次出現值。lastValue保存那一年的最后一次出現值。label年值occurance陣列中每年的計數。
從從 獲得的累積結果中Array.reduce,運行Array.map以生成您想要的輸出。它會lastValue - firstValue。如果您只對沒有符號的正差異感興趣,請使用Math.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)
uj5u.com熱心網友回復:
使用矩庫,您可以moment("2021-10-17T14:38:45.540Z").format('YYYY')
在準備陣列物件后將日期字串提取到年份中
,您可以簡單地對陣列進行排序并找到答案
在這里你必須制作單獨的一組同年資料,然后第一個和最后一個索引可以簡單地在 for 回圈中找到
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/337185.html
標籤:javascript 数组 日期 数组缩减
上一篇:日歷日期排序:職業概覽
下一篇:通過迭代另一列來創建一列
