Javascript意外排序顺序

时间:2018-05-04 13:23:29

标签: javascript google-chrome

使用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 :(得分:2)

您必须提供3个选项

array.sort((f, s) => {
  if(f.path < s.path){return -1}
  if(f.path > s.path){return 1} 
  return 0;
});

基本上js比较函数需要返回一个整数,因为&#39;&gt;&#39;返回一个布尔值,然后返回true == 1和false == 0,所以当返回false时,它被解释为元素相等,而不是-1,而不是另一个。

答案 1 :(得分:0)

首先,您将两个字符串比较为数字,因此我认为编译器会将字符串转换为数字,然后在执行时对它们进行比较:

f.path > s.path 

答案 2 :(得分:0)

您按path排序,而不是id

尝试array.sort((f, s) => f.id - s.id);

答案 3 :(得分:0)

您需要将排序条件更改为代码中不正确的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);