Уменьшение массива объектов с повторяющимися идентификаторами с помощью свойства второй даты - PullRequest
0 голосов
/ 10 октября 2019

У меня есть массив объектов, и у всех них есть по крайней мере 1 другой объект с таким же идентификатором. Я пытаюсь уменьшить этот массив, чтобы вернуть только объект с самой последней датой. Пример массива того, с чем я имею дело:

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}
]

Я нашел много примеров уменьшения или удаления дублирующихся объектов с помощьюИдентификатор полностью, но я не могу найти пример, чтобы сначала идентифицировать объекты с одинаковым идентификатором, а затем уменьшить его с помощью второго свойства. К сожалению, я продолжаю создавать множество вложенных циклов. Есть ли элегантный способ сделать это? Я должен быть в состоянии сделать это в 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
  }
}

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Я бы пошел с вашим стилем первой фильтрации идентификаторов к уникальным, потому что это самая простая часть. Затем вы можете просто связать функцию массива, чтобы извлечь последнюю дату:

  1. сопоставить уникальные идентификаторы, чтобы ваши возвращаемые значения создали новый массив в конце.

  2. отфильтровать исходный массив, чтобы включить в него только объект с идентификатором, над которым мы сейчас работаем

  3. отсортировать временный массив, созданный со всеми объектами с одинаковым идентификатором, так, чтобы самый последний из них былсначала и верните первый элемент.

    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 теперь и массив, содержащий только один объект с самой последней датой для каждого идентификатора:)

1 голос
/ 10 октября 2019

Вы можете отсортировать массив по дате, получить массив id s и дедуплицировать его, затем map дедуплицированный массив, чтобы заменить их реальными объектами из отсортированного массива, Array.find вернет первый соответствующий результат:

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