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, '')
    }
  })
}


Как его можно сделать короче, проще, удобнее?
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const sortedArr = arr
  .map(n => [ n, +(n.price.new ?? n.price).replace(/\D/g, '') ])
  .sort((a, b) => b[1] - a[1])
  .map(n => n[0]);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 07:47
2000 руб./за проект
26 апр. 2024, в 06:46
1000 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект