Как корректно отсортировать массив со строками из чисел и букв

Есть массив со строками из числовых значений и обычных строк, например:

[
  "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 );
→ Ссылка