Javascript сортировка массива для обычных строк и строк чисел - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть массив, который может быть либо просто списком строк, либо это может быть просто список строк чисел, т. Е. Массив может быть как ниже

let array = ['abc','def','aef','gfh']
             or
let array = ['123','456','192','412']

Я хочу иметь функцию сортировки, которая может обрабатывать естественную сортировку в любом из этих случаев, приведенный ниже код не обрабатывает строку чисел, есть ли способ справиться с этим?

    array.sort((a,b) => {
        if(a > b) return 1;
        if(a < b) return -1;
        return 0;
    });

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Вы можете сделать это, используя метод String#localeCompare(), например:

let array = ['abc', 'def', 'aef', 'gfh']
array.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log(array)

array = ['123', '456', '192', '412', '5']
array.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log(array)
.as-console-wrapper { max-height: 100% !important; top: 0; }

Как уже упоминалось в документах , для сортировки чисел c нам просто нужно использовать параметр {numeric: true}.

// by default, "2" > "10"
console.log(["2", "10"].sort((a,b) => a.localeCompare(b))); // ["10", "2"]

// numeric using options:
console.log(["2", "10"].sort((a,b) => a.localeCompare(b, undefined, {numeric: true})));
// ["2", "10"]
2 голосов
/ 15 апреля 2020

Вы можете проверить, является ли элемент в array числом или строкой в ​​функции sort.

Проверка isNaN(string) сообщит вам, если это не число:

function sortNumOrStr(array) {
  return array.sort((a, b) => isNaN(a) ? a.localeCompare(b) : +a - b);
}

let array = ['abc', 'def', 'aef', 'gfh']
console.log(sortNumOrStr(array));
array =  ['123', '456', '-90', '192', '412'];
console.log(sortNumOrStr(array));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...