【问题标题】:Why does my very, very simple sort function return an unsorted list为什么我非常非常简单的排序函数返回一个未排序的列表
【发布时间】:2014-05-05 22:22:27
【问题描述】:

如果我这样做:

var my_list = ["g", "be", "d", "f", "hu", "i", "jc", "lu", "ma", "mi", "w"];
var sorted_list = my_list.sort(function(a,b) {
                        return a > b;
                       });
console.log(sorted_list);

我明白了:

["i", "g", "d", "f", "be", "hu", "jc", "lu", "ma", "mi", "w"]

(如果我再试一次,我会得到不同的未排序结果)。

但是当我这样做时:

var my_list = ["g", "be", "d", "f", "hu", "i", "jc", "lu", "ma", "mi", "w"];
var sorted_list = my_list.sort();
console.log(sorted_list);

我得到正确的排序结果:

["be", "d", "f", "g", "hu", "i", "jc", "lu", "ma", "mi", "w"]

我提供的排序功能有什么问题?

我不能在没有函数的情况下使用 sort,因为在我的真实代码中,我正在尝试对对象进行排序。如果这不起作用,是否有另一种方法可以按某个属性对对象进行排序?

【问题讨论】:

    标签: javascript arrays list sorting


    【解决方案1】:

    比较函数应返回 -1、0 或 1 值,具体取决于操作数的比较方式。

    如果您只执行相等性检查(产生 0 或 1),则排序结果将是不确定的,因为内部排序算法本质上是不稳定的。

    这相当于标准排序:

    if (a == b) {
        return 0;
    } else if (a < b) {
        return -1;
    } else { // a > b
        return 1;
    }
    

    以上内容并不是特别有用,只是用来说明应该存在哪些比较元素。

    【讨论】:

    • 为什么要将 if/else 与条件运算符混合使用?
    • @Berg
    【解决方案2】:

    比较函数应该返回一个数字而不是布尔值。或者,您可以使用专门为此目的设计的 String.prototype.localeCompare 方法:

    var sorted_list = my_list.sort(function(a, b) {
        return a.localeCompare(b);
    });
    

    localeCompare() 方法返回一个数字,指示引用字符串是在排序顺序之前还是之后或与给定字符串相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多