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

Рейтинг: 0Ответов: 1Опубликовано: 17.03.2023

Люди добрые, помогите понять как сортируются подобные массивы, нужно отсортировать по строковому значению price. Нужно 2 массива, с сортировкой убыванию и по возростанию.

Пробовал при помощи sort с использованием localeCompare, но это не срабатывает

let arrObj = [
  { key: 'hguh93', price: '584' },
  { key: 'h7d4hk', price: '654' },
  { key: 'lo5zi9', price: '84.5' },
  { key: '0hs3kl', price: '4.58' },
  { key: '6hjfwe', price: '984.1' },
  { key: '824rds', price: '0.45' },
];

arrObj.sort((x, y) => x.price.localeCompare(y.price));

console.log( 'Сортировка по убыванию:' );
console.log( arrObj );
console.log( 'Сортировка по возростанию:' );
console.log( arrObj );

Ответы

▲ 0Принят

Если я правильно понял проблемы, а) массив сортировался всегда по возрастанию, б) не было двух массивов, отсортированных по-разному. Первая проблема решается применением множителя -1 к результату метода localeCompare (который возвращает -1, 0 или 1), вторая - созданием копий массива.

Сортировка цен как чисел:

let arrObj = [
    {key: 'hguh93', price: '584'},
    {key: 'h7d4hk', price: '654'},
    {key: 'lo5zi9', price: '84.5'},
    {key: '0hs3kl', price: '4.58'},
    {key: '6hjfwe', price: '984.1'},
    {key: '824rds', price: '0.45'},
];

down = arrObj.slice()
down.sort((x, y) => parseFloat(y.price) - parseFloat(x.price));
up = arrObj.slice()
up.sort((x, y) => parseFloat(x.price) - parseFloat(y.price));

console.log('Сортировка по убыванию:');
console.log(down);

console.log('Сортировка по возрастанию:');
console.log(up);

Сортировка цен как текста:

let arrObj = [
    {key: 'hguh93', price: '584'},
    {key: 'h7d4hk', price: '654'},
    {key: 'lo5zi9', price: '84.5'},
    {key: '0hs3kl', price: '4.58'},
    {key: '6hjfwe', price: '984.1'},
    {key: '824rds', price: '0.45'},
];

down = arrObj.slice() // копируем массив
down.sort((x, y) => -1 * x.price.localeCompare(y.price)); // меняем порядок сортировки умножением на -1
up = arrObj.slice() // копируем массив
up.sort((x, y) => x.price.localeCompare(y.price));

console.log('Сортировка по убыванию:');
console.log(down);

console.log('Сортировка по возрастанию:');
console.log(up);