Как я могу отсортировать этот массив по новой цене и цене? если кода будет больше, то функция будет отсортирована неправильно Я написал код, но работает некорректно const sortedByPrice = () => {const ...

0
user402114 10 Апр 2021 в 09:45

2 ответа

Лучший ответ

Потому что у цены не всегда есть свойство newUan. Вы можете сделать что-то подобное внутри обратного вызова sort, parseInt(b.price.newUan || b.price). Здесь говорится, что если newUan существует, преобразовать его в целое число, но если его нет, тогда преобразовать price в целое число.

Я также удалил пробелы из цен, чтобы их можно было правильно преобразовать в целые числа.

См. Фрагмент ниже:

const products = [
  {
    ratingReviews: '264 отзыва',
    price: {
      oldUan: '4 333 грн',
      newUan: '3 799 грн',
    },
    name: 'Motorola MOTO G4 (XT1622) Black',
  },
  {
    ratingReviews: '1355 отзывов',
    price: '4 999 грн',
    name:
      'Samsung Galaxy J7 J700H/DS Black + карта памяти 16гб + чехол + защитное стекло!',
  },
  {
    ratingReviews: '426 отзывов',
    price: '5 199 грн',
    name: 'Samsung Galaxy J5 (2016) J510H/DS Black + защитное стекло + чехол!',
  },
];

const sortedByPrice = () => {
  const sortPrice = products.slice();
  sortPrice.sort(
    (a, b) =>
      parseInt((b.price.newUan || b.price).replace(" ", "")) -
      parseInt((a.price.newUan || a.price).replace(" ", ""))
  );
  return sortPrice;
};

console.log(sortedByPrice());
0
Som Shekhar Mukherjee 10 Апр 2021 в 07:31

Вы можете проверить наличие newUan с помощью оператора ||, а затем получить запасной вариант price и, соответственно, продолжить. Также не должно быть пробелов между price, например 4 333. Это заставит parseInt вернуть 4.

const sortedByPrice = () => {
  const sortPrice = products.slice()
  sortPrice.sort((a, b) => {
    let first = a.price.newUan || a.price;
    let second = b.price.newUan || b.price;
    return parseInt(second) - parseInt(first);
  })
  return sortPrice;
};

const products = [{
    ratingReviews: '264 отзыва',
    price: {
      oldUan: '4333 грн',
      newUan: '3799 грн',
    },
    name: 'Motorola MOTO G4 (XT1622) Black',
  }, {
    ratingReviews: '1355 отзывов',
    price: '4999 грн',
    name: 'Samsung Galaxy J7 J700H/DS Black + карта памяти 16гб + чехол + защитное стекло!',
  }, {
    ratingReviews: '426 отзывов',
    price: '5199 грн',
    name: 'Samsung Galaxy J5 (2016) J510H/DS Black + защитное стекло + чехол!',
  },
  {
    ratingReviews: '426 отзывов',
    price: '2000 грн',
    name: 'Samsung Galaxy J5 (2016) J510H/DS Black + защитное стекло + чехол!',
  }
];


console.log(sortedByPrice())
0
Lakshya Thakur 10 Апр 2021 в 07:01