【问题标题】:Sorting / compare in Chrome vs Firefox在 Chrome 和 Firefox 中排序/比较
【发布时间】:2020-10-16 21:22:21
【问题描述】:

我在 Windows 10 上运行最新的 Firefox 和 Chrome。我相信 Mac 上也存在同样的问题。

当我有a compare function 时,有人可以向我解释为什么当我console.log a 和 b 时,Chrome 中的结果与 Firefox 中的结果相反。不过奇怪的是,排序后的结果是一样的,这没有任何意义:

var arr = [3, 1, 2];
var sorted_arr = arr.sort(function(a, b) {
  console.log("a, b = ", a, b);
  return a - b;
});

console.log(sorted_arr);

console.log 的第一行在 Chrome 中显示为a, b = 1 3,而在 Firefox 中显示为a, b = 3 1

【问题讨论】:

  • “排序后的结果是一样的,没有任何意义” - 为什么不呢?您的比较函数仅被调用以确定两个元素中的哪一个应该在排序中排在第一位,它不会告诉您排序是如何实现的
  • @UnholySheep,因为我没有遇到任何其他 JS 方法,它们要么交换不同浏览器中的参数顺序,要么本质上处理 +1 的方式与另一个浏览器处理 -1 的方式相同。跨度>
  • 所以如果a = 2b = 5。顺序有所不同2 - 5 = -35 - 2 = 3。然而结果是一样的,这是最初的问题。此页面上的答案都没有真正回答 OP 的问题。

标签: javascript arrays sorting


【解决方案1】:

浏览器可以随意实现sort,并且您不应依赖于对比较函数的任何特定调用顺序。

【讨论】:

    【解决方案2】:

    这个问题的答案可能会有所帮助:How does JavaScript's sort (compareFunction) work? [duplicate]

    基本上,浏览器没有严格的方法来实现sort,就像这里所说的其他答案一样。不过,这个较长的解释可能会让它更清楚,因为它更深入一些。

    【讨论】:

      【解决方案3】:

      当涉及到 ECMAScript 标准时,HOST(浏览器)不遵循“实现定义”的策略。这意味着 Array.prototype.sort 方法的行为可能在引擎实现之间有所不同。请参考以下链接下的官方文档:

      https://tc39.es/ecma262/#sec-array.prototype.sort

      https://tc39.es/ecma262/#implementation-defined

      如果您想在浏览器之间实现不明显的一致排序行为,您应该将数组映射到索引对象。在这种情况下,Chrome 和 Firefox 都会对索引和值进行相同的迭代。

      var arr = [3,1,2];
      var sorted_arr = arr.sort(function(a,b) {
        console.log("a, b = ", a, b);
        if (a < b) {
          return -1;
        }
        if (a > b) {
          return 1;
        }
        // a must be equal to b
        return 0;
      });
      
      console.log("sorted_arr: ", sorted_arr)
      
      var mapped = arr.map(function(el, i) {
        return { index: i, value: el.toString().toLowerCase() };
      })
      
      mapped.sort(function(a, b) {
        console.log("map: ", a, b)
        if (a.value > b.value) {
          return 1;
        }
        if (a.value < b.value) {
          return -1;
        }
        return 0;
      });
      
      // container for the resulting order
      var result = mapped.map(function(el){
        return arr[el.index];
      });
      
      
      console.log("result: ", result)
      

      https://jsfiddle.net/cw65b4t8/

      【讨论】:

        猜你喜欢
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多