@balex777

Как отсортировать массив объектов по свойству с учетом того что свойство не в каждом объекте присутствует?

Допустим есть массив объектов
let users = [
    {
        id: 1,
        name: 'Denis',
        age: 28
    },
    {
        id: 2,
        name: 'Olga'
    },
    {
        id: 3,
        name: 'Ivan',
        age: 18
    }
];


Как отсортировать объекты по свойству age, чтобы если не было свойства age, то этот объект отправлялся в конец.

Вот этот метод он естественно не работает

users.sort((prev, next) => prev.age - next.age);
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Отсортировать существующий массив:

users.sort((a, b) => (a.age ?? Infinity) - (b.age ?? Infinity));

Собрать отсортированный новый:

const sortedUsers = Object
  .values(users.reduce((acc, n) => ((acc[n.age] = acc[n.age] ?? []).push(n), acc), {}))
  .flat();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dimoff66
Кратко о себе: Я есть
Для быстроты, чтобы не делать лишних сортировочных телодвижений я бы сделал
let [withAge, withoutAge] = users.reduce((agg, v) => {
  agg['age' in v].push(v)
  return agg
}, [[], []])
const sorted = [...withAge.sort((a, b) => a.age - b.age), ...withoutAge]


или более кратко с использованием библиотеки lodash

let [withoutAge, withAge] = _.partition(users, ({ age }) => age)
const sorted = [..._.sort(withAge, 'age'), ...withoutAge]

Хотя это будет не сортировка на месте, как при стандартном sort, Но не думаю что это принципиально
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы