Как отфильтровать массив объектов, оставив только определенные элементы?

Как можно эффективно удалить из массива объект, где значения свойств uid и owner совпадают, оставив объект с более поздней датой createdAt?
  • 28 июля 2024 г. 17:23
Ответы на вопрос 2
Для фильтрации массива объектов и оставления только определенных элементов можно воспользоваться методом filter() в сочетании с использованием условия. Например, если необходимо оставить только объекты, у которых свойство "status" равно "active", можно использовать следующий код:

```javascript
const filteredArray = arrayOfObjects.filter(obj => obj.status === 'active');
```

Для удаления из массива объектов, где значения свойств uid и owner совпадают, оставив объект с более поздней датой createdAt, можно сначала отфильтровать массив, оставив только те объекты, где uid и owner не совпадают, а затем отсортировать массив по убыванию даты createdAt и оставить первый элемент. Например:

```javascript
const sortedArray = arrayOfObjects.filter((obj, index, self) =>
  index === self.findIndex((t) => (
    t.uid === obj.uid && t.owner === obj.owner
  ))
).sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));

const finalArray = sortedArray.slice(); // оставляем только первый элемент
```

Этот код отфильтрует массив arrayOfObjects, оставив только объекты, где значения свойств uid и owner не совпадают, а затем отсортирует массив по убыванию даты createdAt и оставит только первый элемент.
Как-то так, если без учёта дубликатов, в один проход. 
function removeSomeShit(arr) {
  const table = {};
  const result = [];

  for(const current of arr) {
    const {uid, owner, createdAt} = current;

    const uidOvnerKey = `${uid}\0${owner}`;
    const ownerUidKey = `${owner}\0${uid}`;

    const matched = table[uidOvnerKey];

    if (matched) {
      delete table[uidOvnerKey];
      result.push(matched.createdAt > createdAt ? matched : current);
    } else {
      table[ownerUidKey] = current;
    }
  };
  
  return Object.values(table).concat(result);
}
Похожие вопросы