5

Как отсортировать строки в JavaScript

12

У меня есть список объектов, которые я хочу отсортировать по полю attr типа строка. Я попытался использовать оператор - для этого:

list.sort(function (a, b) {
    return a.attr - b.attr;
});

Однако я обнаружил, что оператор - не работает со строками в JavaScript. Как я могу отсортировать список объектов по атрибуту, который имеет тип строка?

5 ответ(ов)

0

Ответ (в современном 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))

Описание

Приведение булевого значения к числу дает следующие результаты:

  • true1
  • false0

Рассмотрим три возможных сценария:

  • x больше y: (x > y) - (y < x)1 - 01
  • x равен y: (x > y) - (y < x)0 - 00
  • x меньше y: (x > y) - (y < x)0 - 1-1

(Альтернатива)

  • x больше y: +(x > y) || -(x < y)1 || 01
  • x равен y: +(x > y) || -(x < y)0 || 00
  • x меньше y: +(x > y) || -(x < y)0 || -1-1

Таким образом, эта логика эквивалентна типичным функциям сравнения для сортировки.

if (x == y) {
    return 0;
}
return x > y ? 1 : -1;
0

В 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

Таким образом, использование первого подхода делает вашу сортировку более оптимизированной, особенно в случаях, когда длина списка значительна и имеется повторяющиеся значения атрибутов.

0

В вашем коде рекомендуется использовать операторы > или <, а также ==. В результате, решение будет выглядеть следующим образом:

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.

0

Вы можете использовать вложенные тернарные операторы в стрелочных функциях для упрощения логики сравнения. В вашем примере функция принимает два аргумента a и b и возвращает:

  • -1, если a меньше b
  • 1, если a больше b
  • 0, если a равен b

Вот как это выглядит в коде:

const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);

Этот подход позволяет компактно выразить логику сравнения без использования сложных условных конструкций. Тем не менее, стоит помнить, что чрезмерное использование вложенных тернарных операторов может ухудшить читаемость кода. В некоторых случаях лучше использовать обычные условные конструкции для большего понимания.

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 демонстрируют, как сортировать массив строк в обоих направлениях.

Если у вас есть другие вопросы по данному коду, не стесняйтесь спрашивать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь