代码之家  ›  专栏  ›  技术社区  ›  Artsiom Miksiuk

ie array.sort不使用比较函数排序

  •  0
  • Artsiom Miksiuk  · 技术社区  · 8 年前

    下面是在IE11中不能正常工作的代码示例。

    id=end3的元素应该是最后一个元素。

    只是不要告诉我需要手动编写排序。实现它并不重要,但真的吗?!

    var list = [{
        id: "SP1"
      },
      {
        id: "SP4"
      },
      {
        id: "END3"
      },
      {
        id: "SP2"
      }
    ];
    
    console.log(
      list.sort(function(a, b) {
        if (a.id === "END3") {
          return 1;
        }
    
        return 0;
      })
    );
    2 回复  |  直到 8 年前
        1
  •  1
  •   deceze    8 年前

    排序比较函数的行为不一致。函数应该返回 < 0 , 0 或 > 0 ,不仅仅是 1 或 零 . 如果它不返回这些值,你就给 sort 使用错误的信息,因为您告诉它任何比较 a 所需值是否相等?不能保证 END3 将作为 一 在任何时候,所有的比较都是“相等的”,所以结果是什么是不确定的。也有可能是 SP1, END3 (同等)和 END3, SP1 (较大)将影响排序算法的假设。

    var list = [{id: "SP1"}, {id: "SP4"}, {id: "END3"}, {id: "SP2"}];
    
    
    console.log(list.sort(function(a, b) {
      if (a.id === 'END3') {
        return 1;
      } else if (b.id === 'END3') {
        return -1;
      } else {
        return 0;
      }
    }));
        2
  •  1
  •   Satpal    8 年前

    返回 -1 而不是 0 在Else区。当compare方法返回时 零 它离开了 a 和 b 不变。

    var list = [{
        id: "SP1"
      },
      {
        id: "SP4"
      },
      {
        id: "END3"
      },
      {
        id: "SP2"
      }
    ];
    
    console.log(
      list.sort(function(a, b) {
        if (a.id === "END3") {
          return 1;
        }
    
        return -1;
      })
    );

    Docs