Как отсортировать строки в JavaScript
У меня есть список объектов, которые я хочу отсортировать по полю attr
типа строка. Я попытался использовать оператор -
для этого:
list.sort(function (a, b) {
return a.attr - b.attr;
});
Однако я обнаружил, что оператор -
не работает со строками в JavaScript. Как я могу отсортировать список объектов по атрибуту, который имеет тип строка?
5 ответ(ов)
Ответ (в современном ECMAScript)
list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr))
Или
list.sort((a, b) => +(a.attr > b.attr) || -(a.attr < b.attr))
Описание
Приведение булевого значения к числу дает следующие результаты:
true
→1
false
→0
Рассмотрим три возможных сценария:
- x больше y:
(x > y) - (y < x)
→1 - 0
→1
- x равен y:
(x > y) - (y < x)
→0 - 0
→0
- x меньше y:
(x > y) - (y < x)
→0 - 1
→-1
(Альтернатива)
- x больше y:
+(x > y) || -(x < y)
→1 || 0
→1
- x равен y:
+(x > y) || -(x < y)
→0 || 0
→0
- x меньше y:
+(x > y) || -(x < y)
→0 || -1
→-1
Таким образом, эта логика эквивалентна типичным функциям сравнения для сортировки.
if (x == y) {
return 0;
}
return x > y ? 1 : -1;
В JavaScript строки можно сравнивать напрямую, поэтому для сортировки можно использовать следующий код:
list.sort(function (a, b) {
return a.attr < b.attr ? -1 : 1;
});
Этот подход немного эффективнее, чем использование следующего кода:
return a.attr > b.attr ? 1 : -1;
Причина в том, что когда элементы имеют одинаковое значение атрибута (то есть a.attr == b.attr
), функция сортировки попытается поменять их местами без необходимости.
Например, рассмотрим два варианта функции сортировки:
var so1 = function (a, b) { return a.atr > b.atr ? 1 : -1; };
var so2 = function (a, b) { return a.atr < b.atr ? -1 : 1; }; // Более эффективно
Теперь создадим два массива и отсортируем их:
var m1 = [ { atr: 40, s: "FIRST" }, { atr: 100, s: "LAST" }, { atr: 40, s: "SECOND" } ].sort(so1);
var m2 = [ { atr: 40, s: "FIRST" }, { atr: 100, s: "LAST" }, { atr: 40, s: "SECOND" } ].sort(so2);
Результаты сортировки будут следующими:
// m1 отсортирован, но в нем: 40 SECOND 40 FIRST 100 LAST
// m2 более эффективен: 40 FIRST 40 SECOND 100 LAST
Таким образом, использование первого подхода делает вашу сортировку более оптимизированной, особенно в случаях, когда длина списка значительна и имеется повторяющиеся значения атрибутов.
В вашем коде рекомендуется использовать операторы >
или <
, а также ==
. В результате, решение будет выглядеть следующим образом:
list.sort(function(item1, item2) {
var val1 = item1.attr,
val2 = item2.attr;
if (val1 == val2) return 0; // Если значения равны, не меняем порядок
if (val1 > val2) return 1; // Если val1 больше, item1 должен быть после item2
if (val1 < val2) return -1; // Если val1 меньше, item1 должен быть перед item2
});
Таким образом, ваш код сортирует список list
по атрибуту attr
.
Вы можете использовать вложенные тернарные операторы в стрелочных функциях для упрощения логики сравнения. В вашем примере функция принимает два аргумента a
и b
и возвращает:
-1
, еслиa
меньшеb
1
, еслиa
большеb
0
, еслиa
равенb
Вот как это выглядит в коде:
const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
Этот подход позволяет компактно выразить логику сравнения без использования сложных условных конструкций. Тем не менее, стоит помнить, что чрезмерное использование вложенных тернарных операторов может ухудшить читаемость кода. В некоторых случаях лучше использовать обычные условные конструкции для большего понимания.
Вам нужно отсортировать массив строк в TypeScript по заданному порядку (восходящему или нисходящему)? Ниже представлено решение с использованием пользовательской функции сортировки:
const data = ["jane", "mike", "salome", "ababus", "buisa", "dennis"];
const sortStringArray = (stringArray: string[], mode?: 'desc' | 'asc') => {
if (!mode || mode === 'asc') {
return stringArray.sort((a, b) => a.localeCompare(b));
}
return stringArray.sort((a, b) => b.localeCompare(a));
}
console.log(sortStringArray(data, 'desc')); // [ 'salome', 'mike', 'jane', 'dennis', 'buisa', 'ababus' ]
console.log(sortStringArray(data, 'asc')); // [ 'ababus', 'buisa', 'dennis', 'jane', 'mike', 'salome' ]
Объяснение:
sortStringArray
— это функция, которая принимает массив строк и необязательный аргументmode
, который может быть либо'asc'
(по умолчанию) для сортировки в восходящем порядке, либо'desc'
для сортировки в нисходящем порядке.- Внутри функции используется метод
sort()
, который применяетlocaleCompare
для правильной сортировки строк в соответствии с локалью. - Вызовы
console.log
демонстрируют, как сортировать массив строк в обоих направлениях.
Если у вас есть другие вопросы по данному коду, не стесняйтесь спрашивать!
Как присвоить многострочную строку переменной?
Преобразование объекта JS в строку JSON
Как преобразовать строку, разделённую запятыми, в массив?
Как заменить символ по заданному индексу в JavaScript?
Удалить первый символ строки, если он равен 0