Задать вопрос
Toxa26
@Toxa26
Студент. Люблю верстать сайты.

Как упростить сортировку массива объектов?

Есть подобный массив объектов:
const tels= [{
    price: {
        old: '4 444 грн',
        new: '3 744 грн',
    },
    name: 'Motorola MOTO G4 (XT1622) Black',
}, {
    price: '6 199 грн',
    name: 'Samsung Galaxy J7 (2016) J710F/DS Gold + защитное стекло + чехол!',
}, {
    price: {
        old: '5 555 грн',
        new: '2 995 грн',
    },
    name: 'Lenovo K5 (A6020a40) Silver',
}, {
    price: {
        old: '9 999 грн',
        new: '8 999 грн',
    },
    name: 'Apple iPhone 5s 16GB Space Gray',
}, {
    price: '6 999 грн',
    name: 'Nokia 5 Dual Sim Tempered Blue',
}, {
    price: '11 999 грн',
    name: 'Samsung Galaxy A5 2017 Duos SM-A520 Black + карта памяти 128гб!',
}];


Необходимо его отсортировать по убыванию price, но если в объекте 2 цены, то использовать new.
Мой вариант решения:
const sortedByPrice = () => {
  return tels.sort((a, b) => {
    if(typeof b.price === 'object' && typeof a.price === 'object') {
      return b.price.new.replace(/[^\d]/g, '') - a.price.new.replace(/[^\d]/g, '')
    } else if(typeof a.price === 'object' && typeof b.price === 'string') {
      return b.price.replace(/[^\d]/g, '') - a.price.new.replace(/[^\d]/g, '')
    } else if(typeof a.price === 'string' && typeof b.price === 'object') {
      return b.price.new.replace(/[^\d]/g, '') - a.price.replace(/[^\d]/g, '')
    } else {
      return b.price.replace(/[^\d]/g, '') - a.price.replace(/[^\d]/g, '')
    }
  })
}


Как его можно сделать короче, проще, удобнее?
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Проверять тип свойства с ценой необходимости нет - пробуем достать новую цену, в случае отсутствия получим undefined, вместо которого с помощью nullish coalescing подставляем просто цену. А чтобы не копипастить извлечение цены, вынесем его в отдельную функцию, которую, как и сам сортируемый массив, можно сделать параметром функции сортировки.

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


const sortedArr = sorted(arr, n => -(n.price.new ?? n.price).replace(/\D/g, ''));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
22 дек. 2024, в 13:01
50000 руб./за проект
22 дек. 2024, в 10:44
15000 руб./за проект
22 дек. 2024, в 10:12
10000 руб./за проект