Использование Chrome версии 66.0.3359.117
(официальная сборка) (64-разрядная версия)
Сортировка нижнего массива Я ожидаю, что элемент с id = 1 будет наверху, что не так. Если я уменьшу количество элементов до 2, сортировка будет работать, как ожидалось. Может ли кто-нибудь объяснить, почему я получу здесь не детерминированный результат?
let array = [
{ "id": 1, "path": "01.00.00.00.00.00.00" },
{ "id": 2, "path": "01.02.00.00.00.00.00" },
{ "id": 3, "path": "01.02.03.00.00.00.00" },
{ "id": 4, "path": "01.02.04.00.00.00.00" },
{ "id": 5, "path": "01.02.05.00.00.00.00" },
{ "id": 6, "path": "01.02.06.00.00.00.00" },
{ "id": 7, "path": "01.02.05.07.00.00.00" },
{ "id": 8, "path": "01.02.05.07.08.00.00" },
{ "id": 9, "path": "01.02.05.07.08.09.00" },
{ "id": 10, "path": "01.02.04.10.00.00.00" },
{ "id": 11, "path": "01.02.05.07.08.09.11" },
{ "id": 12, "path": "01.02.04.10.12.00.00" }
];
array.sort((f, s) => f.path > s.path);
console.error("Full", array[0].id);
array = [
{ "id": 1, "path": "01.00.00.00.00.00.00" },
{ "id": 2, "path": "01.02.00.00.00.00.00" }
//{ "id": 3, "path": "01.02.03.00.00.00.00" },
//{ "id": 4, "path": "01.02.04.00.00.00.00" },
//{ "id": 5, "path": "01.02.05.00.00.00.00" },
//{ "id": 6, "path": "01.02.06.00.00.00.00" },
//{ "id": 7, "path": "01.02.05.07.00.00.00" },
//{ "id": 8, "path": "01.02.05.07.08.00.00" },
//{ "id": 9, "path": "01.02.05.07.08.09.00" },
//{ "id": 10, "path": "01.02.04.10.00.00.00" },
//{ "id": 11, "path": "01.02.05.07.08.09.11" },
//{ "id": 12, "path": "01.02.04.10.12.00.00" }
];
array.sort((f, s) => f.path > s.path);
console.error("Reduced", array[0].id);
Вам необходимо изменить условие сортировки на f.id - s.id
что неверно в вашем коде.
let array = [
{ "id": 1, "path": "01.00.00.00.00.00.00" },
{ "id": 2, "path": "01.02.00.00.00.00.00" },
{ "id": 3, "path": "01.02.03.00.00.00.00" },
{ "id": 4, "path": "01.02.04.00.00.00.00" },
{ "id": 5, "path": "01.02.05.00.00.00.00" },
{ "id": 6, "path": "01.02.06.00.00.00.00" },
{ "id": 7, "path": "01.02.05.07.00.00.00" },
{ "id": 8, "path": "01.02.05.07.08.00.00" },
{ "id": 9, "path": "01.02.05.07.08.09.00" },
{ "id": 10, "path": "01.02.04.10.00.00.00" },
{ "id": 11, "path": "01.02.05.07.08.09.11" },
{ "id": 12, "path": "01.02.04.10.12.00.00" }
];
array.sort((f, s) => f.id - s.id);
console.error("Full", array[0].id);
Вы должны предоставить 3 варианта
array.sort((f, s) => {
if(f.path < s.path){return -1}
if(f.path > s.path){return 1}
return 0;
});
В принципе, функция сравнения js должна возвращать целое число, так как '>' возвращает логическое значение, тогда true == 1 и false == 0, поэтому при возврате false интерпретируется как равные элементы, а не -1 чем другой.
return s.path - f.path
, нет?
Вы сортируете по path
, а не по id
.
Попробуйте array.sort((f, s) => f.id - s.id);
Во-первых, вы сравниваете две строки так, как будто они являются числами, поэтому я думаю, что компилятор преобразует строку в числа и затем сравнивает их, когда вы делаете:
f.path > s.path