Javascript Неожиданный порядок сортировки - PullRequest
0 голосов
/ 04 мая 2018

Использование версии 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);

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Вы должны предоставить 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 один слабее другого.

0 голосов
/ 04 мая 2018

Вы сортируете по path, а не id.

Попробуйте array.sort((f, s) => f.id - s.id);

0 голосов
/ 04 мая 2018

Вам нужно изменить условие сортировки на 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);
    
0 голосов
/ 04 мая 2018

Сначала вы сравниваете две строки так, как будто они являются числами, поэтому я думаю, что компилятор преобразует строку в числа, а затем сравнивает их, когда вы делаете:

f.path > s.path 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...