提问人:Joao Livio 提问时间:6/1/2022 最后编辑:Rohìt JíndalJoao Livio 更新时间:6/8/2022 访问量:61
从 Array 分组并获取更大的日期
Group and get bigger date from Array
问:
首先,如果我解释得不好,请告诉我。
问题
我遇到了一个问题,这是我的对象一个代码,它由LevelId
给出以下对象的组代码:
function groupBy(arr, property) {
return arr.reduce(function (memo, x) {
if (!memo[x[property]]) { memo[x[property]] = []; }
memo[x[property]].push(x);
return memo;
}, {});
}
let o = groupBy(levels, 'LevelId');
var result = Object.keys(o).map((key) => [Number(key), o[key]]);
我的对象
[
[
2,
[
{
"Id": 5037,
"Date1": "2016-06-22T22:00:00Z",
"LevelId": 2,
"ParticipantId": 9915,
"ID": 5037
},
{
"Id": 5722,
"Date1": "2017-08-11T22:00:00Z",
"LevelId": 2,
"ParticipantId": 9915,
"ID": 5722
}
]
],
[
4,
[
{
"Id": 5720,
"Date1": "2017-08-09T22:00:00Z",
"LevelId": 4,
"ParticipantId": 9915,
"ID": 5720
},
{
"Id": 5721,
"Date1": "2017-08-10T22:00:00Z",
"LevelId": 4,
"ParticipantId": 9915,
"ID": 5721
}
]
]
]
我现在的问题是为每个选择更大的日期,在本例中为 2 和 4,并且只有该特定项目。LevelId
我的尝试
在我拥有这段代码之前,它效果很好,但只适用于一个级别
let isLast = levels[0];
for (let date of levels) {
if (moment(date.Date1) > moment(isLast.Date1)) {
isLast = date;
}
}
对于此对象
[
{
"Id": 5037,
"Date1": "2016-06-22T22:00:00Z",
"LevelId": 2,
"ParticipantId": 9915,
"ID": 5037
},
{
"Id": 5720,
"Date1": "2017-08-09T22:00:00Z",
"LevelId": 4,
"ParticipantId": 9915,
"ID": 5720
},
{
"Id": 5721,
"Date1": "2017-08-10T22:00:00Z",
"LevelId": 4,
"ParticipantId": 9915,
"ID": 5721
},
{
"Id": 5722,
"Date1": "2017-08-11T22:00:00Z",
"LevelId": 2,
"ParticipantId": 9915,
"ID": 5722
}
]
所以问题在于有一个具有最大 DATE 的项目LevelId
答:
0赞
Albi Patozi
6/1/2022
#1
缓存对象中每个级别的项目,其中键是级别,值是迄今为止日期最大的项目。
var levels = [
{
"Id": 5037,
"Date1": "2016-06-22T22:00:00Z",
"LevelId": 2,
"ParticipantId": 9915,
"ID": 5037
},
{
"Id": 5720,
"Date1": "2017-08-09T22:00:00Z",
"LevelId": 4,
"ParticipantId": 9915,
"ID": 5720
},
{
"Id": 5721,
"Date1": "2017-08-10T22:00:00Z",
"LevelId": 4,
"ParticipantId": 9915,
"ID": 5721
},
{
"Id": 5722,
"Date1": "2017-08-11T22:00:00Z",
"LevelId": 2,
"ParticipantId": 9915,
"ID": 5722
}
];
let isLastLevel = {};
for (let date of levels) {
var isLast = isLastLevel[date.LevelId];
if ( (isLast && moment(date.Date1) > moment(isLast.Date1)) || !isLast) {
isLastLevel[date.LevelId] = date;
}
}
最后,“isLastLevel”将有一个对象,每个级别的日期最大,如下所示:
{
2 : {
"Id": 5722,
"Date1": "2017-08-11T22:00:00Z",
"LevelId": 2,
"ParticipantId": 9915,
"ID": 5722
},
4 : {
"Id": 5721,
"Date1": "2017-08-10T22:00:00Z",
"LevelId": 4,
"ParticipantId": 9915,
"ID": 5721
}
}
评论
0赞
Joao Livio
6/2/2022
嗨,这行不通,因为我必须先推动
0赞
Albi Patozi
6/3/2022
我没有在任何地方使用数组,所以你不必推送。根据你的解释,这绝对应该有效。我的第一个元素有一个错误,但修复了它
0赞
Joao Livio
6/8/2022
没有用,我正在为我的问题提供解决方案
0赞
Joao Livio
6/8/2022
#2
这是我的工作解决方案。
排序,查找,如果最后一个未定义,则推送
levels.sort(function (a, b) {
return + new Date(b.Date1) - + new Date(a.Date1);
});
let lastLevelsTemp = new Array();
let lastLevelsObjs = new Array();
for (let index = 0; index < levels.length; index++) {
const element = levels[index];
if (lastLevelsTemp.length === 0) {
lastLevelsTemp.push(element.LevelId);
lastLevelsObjs.push(element);
}
else {
let last = lastLevelsTemp.find((elm) => {
return elm === element.LevelId;
});
if (last === undefined) {
lastLevelsTemp.push(element.LevelId);
lastLevelsObjs.push(element);
}
}
}
下一个:管理具有多个子列表的表
评论