通过第二个日期减少具有重复 ID 的对象数组 属性

Reduce an Array of Objects With Duplicate IDs by a Second Date Property

我有一个对象数组,所有对象都有至少 1 个具有相同 ID 的其他对象。我正在尝试将此数组缩减为仅 return 具有最新日期的对象。我正在处理的示例数组:

var arrObj = [
   {id: 1, startDate: 2019-10-09},
   {id: 1, startDate: 2019-10-05},
   {id: 1, startDate: 2019-09-30},
   {id: 2, startDate: 2018-08-05},
   {id: 2, startDate: 2018-09-05}
]

我想要实现的输出:

var newArrObj = [
   {id: 1, startDate: 2019-10-09},
   {id: 2, startDate: 2018-09-05}
]

我找到了很多完全按ID减少或删除重复对象的例子,但我似乎找不到先识别具有相同ID的对象,然后减少一秒的例子属性.不幸的是,我一直发现自己创建了很多嵌套的 for 循环。有没有一种优雅的方法可以做到这一点?我需要能够在 ES5 或更早版本中完成。

var uniqueIDs = [];
for (a in arrObj) {
  if(uniqueIDs.indexOf(arrObj[a].id) != -1) {
     uniqueIDs.push(arrObj[a].id);
  }
}

var newArrObj = [];
for(b in uniqueIDs) {
  var uniqueId = uniqueIDs[b];
  var uniqueIdObjs = arrObj.filter(function(x) {
    return x.id === uniqueId;
  });
  for(c in uniqueIdObjs) {
    var objDate = uniqueIdObjs[c].startDate;
    //This is where I get stuck
  }
}

您可以按日期对数组进行排序,获取 id 的数组并对其进行重复数据删除,然后 map 删除重复数据的数组以将它们替换为已排序数组中的实际对象,Array.find 将 return 第一个匹配结果 :

var arrObj = [
  { id: 1, startDate: "2019-10-09" },
  { id: 1, startDate: "2019-10-05" },
  { id: 1, startDate: "2019-09-30" },
  { id: 2, startDate: "2018-08-05" },
  { id: 2, startDate: "2018-09-05" }
];

// Sort by date
var sorted = arrObj.sort((a, b) => new Date(b.startDate) - new Date(a.startDate));

// dedupe the array of ids
var ids = [...new Set(sorted.map(o => o.id))];

// replace the ids with original objects
var result = ids.map(id => sorted.find(o => o.id === id));

console.log(result);

我会采用您首先将 ID 过滤为唯一性的风格,因为那是简单的部分。 然后你可以简单地链接数组函数来提取最后一个日期:

  1. 映射唯一 ID,以便您的 return 在末尾创建一个新数组。

  2. 过滤原始数组以仅包含具有我们现在处理的 ID 的对象

  3. 对使用相同 ID 的所有对象创建的临时数组进行排序,以便最新的排在第一位,return 第一个元素。

    let finalResult = uniqueIDs.map( id => {
       return arrayObj.filter( obj => obj.id === id )
        .sort((a, b) => new Date(b.startDate) - new Date(a.startDate))[0];
    

多田! finalResult 现在是数组,每个 ID 仅包含一个对象,其中包含最新日期:)