@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);
  • Вопрос задан
  • 201 просмотр
Решения вопроса 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();

// или

const sorted = (arr, key) => arr
  .map(n => [ n, key(n) ])
  .sort((a, b) => a[1] - b[1])
  .map(n => n[0]);


const sortedUsers = sorted(users, n => n.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, Но не думаю что это принципиально
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы