为什么我非常非常简单的排序函数返回一个未排序的列表

时间:2014-03-27 05:45:40

标签: javascript arrays list sorting

如果我这样做:

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,因为在我的实际代码中,我试图对对象进行排序。如果这不起作用,我是否可以通过某种属性对对象进行排序?

2 个答案:

答案 0 :(得分:5)

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

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

这相当于标准排序:

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

上述内容并不是非常有用,但仅用于说明应该存在哪些比较元素。

答案 1 :(得分:3)

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

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

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