从 Array 分组并获取更大的日期

Group and get bigger date from Array

提问人:Joao Livio 提问时间:6/1/2022 最后编辑:Rohìt JíndalJoao Livio 更新时间:6/8/2022 访问量:61

问:

首先,如果我解释得不好,请告诉我。

问题

我遇到了一个问题,这是我的对象一个代码,它由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

JavaScript 数组 JSON TypeScript 数据操作

评论


答:

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);
      }
    }
  }