@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);
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
users.sort((a, b) => (a.age ?? Infinity) - (b.age ?? Infinity))
Ответ написан
Пригласить эксперта
Ответы на вопрос 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, Но не думаю что это принципиально
Ответ написан
Ваш ответ на вопрос

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

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