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 шт):
Можно попробовать так.
- Превращаем число в строку,
- разбиваем по точке, получаем два числа, до и после точки.
- Сравниваем сначала числа до точки.
- Если они равны, сравниваем числа после точки.
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())))
сорт который вам может подойти.
Идея сортировки простая
- Если целые части равны
(a|0) - (b|0) === 0(использование бинарных операций для округления чисел) - То сравнить дробные части
(""+a).split('.')[1](преобразование в сроку, разбивка по точке и взятие дробной части) - иначе просто сравнить
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);
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);
Для начала, надо в массиве иметь строки, а не числа. Ну а дальше расписано этом вопросе. В итоге получится так:
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(" "))