JS сортировка массива [1.1,1.10,1.11,1.2...]

Всем привет! Помогите пожалуйста отсортировать массив вида [1.1, 1.10, 1.11, 1.12, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3, ...] так, чтобы чтобы элементы шли по возрастанию как до точки, так и после.

Надо: [1.1, 1.2, 1.3, 1.4, 1.10, 1.11, 1.12, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3, ...]

Пробовал делать parseFloat() в функции sort(), но 1.11 < 1.2 и это не сработало


Ответы (5 шт):

Автор решения: vsemozhebuty

Можно попробовать так.

  1. Превращаем число в строку,
  2. разбиваем по точке, получаем два числа, до и после точки.
  3. Сравниваем сначала числа до точки.
  4. Если они равны, сравниваем числа после точки.

const array = [1.1, 1.10, 1.11, 1.12, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3];

array.sort((a, b) => {
  const [a1, a2] = String(a).split('.').map(Number);
  const [b1, b2] = String(b).split('.').map(Number);

  if (a1 > b1) return 1;
  if (a1 < b1) return -1;
  if (a2 > b2) return 1;
  if (a2 < b2) return -1;
  return 0;
});

console.log(array);

Но, как вы видите, есть подвох: два раза повторяется 1.1, потому что число 1.10 превратится в 1.1. Если вы пытаетесь работать с чем-то вроде индексов вложенных списков, лучше сразу превратить числа в строки, чтобы ноль после дробной части не отбрасывался.

→ Ссылка
Автор решения: Илья

Можно сделать так (на лучшее решение не претендую):

array.sort((a, b) => a.toString().localeCompare(b.toString())))
→ Ссылка
Автор решения: Aziz Umarov

сорт который вам может подойти.

Идея сортировки простая

  1. Если целые части равны (a|0) - (b|0) === 0 (использование бинарных операций для округления чисел)
  2. То сравнить дробные части (""+a).split('.')[1] (преобразование в сроку, разбивка по точке и взятие дробной части)
  3. иначе просто сравнить

const array = [1.1, 1.10, 1.11, 1.12, 1.2, 1.3, 1.4, 2 , 2, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3];

array.sort((a,b)=> (a|0) - (b|0) === 0 ? +((""+a).split('.')[1]) - +((""+b).split('.')[1]) : a - b) ;


console.log(array);

→ Ссылка
Автор решения: DiD

const array = [1.1, '1.10', 1.11, 1.12, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3];
const sorted = array
               .map(v=>([]+v).split('.'))
               .sort(([a1,a2],[b1,b2])=>Math.sign(a1-b1)||Math.sign(a2-b2))
               .map(v=>v.join('.'));
console.log(sorted);

→ Ссылка
Автор решения: Qwertiy

Для начала, надо в массиве иметь строки, а не числа. Ну а дальше расписано этом вопросе. В итоге получится так:

var a = ['1.1', '1.2', '1.3', '1.4', '1.10', '1.11', '1.12', '2.1', '2.2', '2.3', '3.1', '3.2', '3.3']

a.sort((x, y) => {
  x = x.split(".")
  y = y.split(".")
  return x[0] - y[0] || x[1] - y[1]
})

console.log(a.join(" "))

→ Ссылка