Как корректно отсортировать массив со строками из чисел и букв
Есть массив со строками из числовых значений и обычных строк, например:
[
"1",
"11",
"111",
"Product",
"2",
"22",
"App"
]
Как отсортировать этот массив там, чтобы строки, которые можно привести к числам, сортировались как числа ,а не "по алфавиту", а за ними шли отсортированные "по алфавиту" строки?
Ответы (2 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
Одним проходом можно разделить массив на числа и строки, отдельно их отсортировать, потом склеить. Такой подход показался наиболее простым, хотя подозреваю, что можно придумать какую-то хитрую конструкцию с одним sort или сортировать циклом вручную.
let arr = [
"1",
"11",
"111",
"Product",
"1Product",
"0Product",
"2",
"22",
"App"
];
let numbers = [];
let strings = [];
arr.forEach(e => (isNaN(e) ? strings : numbers).push(e) );
numbers = numbers.sort((a,b) => Number(a) - Number(b));
strings = strings.sort();
arr = numbers.concat( strings );
console.log( arr );
Автор решения: lijil
→ Ссылка
[
"1",
"Product",
"11",
"2",
"App",
"22",
"111",
]. sort (( a , b , c = a - b )=> c == c ? c : a > b ? 1 : -1 );