array.sort()和array.sort(function(a,b){return a - b;})之间有什么区别?

时间:2013-01-11 15:48:35

标签: javascript

我有一段代码触发了一些动作。在此之前,它只是对重量进行排序。我使用时一切正常:weight.sort()其中weight是一个非空数组,例如[10 20 30 40],但当我将其更改为:

weight.sort(function(a,b) {
    return a - b;
});

其中一个动作无效(显示div)。老实说,我不知道是什么原因造成的。这对我来说似乎很奇怪,因为weight在使用这两种方法排序之后是相同的,并且明确地改变了那段代码使我的脚本工作与否。 FireBug中没有错误。

3 个答案:

答案 0 :(得分:2)

如果你这样做

weight = weight.sort

使用词典比较对项目进行排序。 => 2 > 10

但是当你做的时候

weight = weight.sort(function(a,b) { return a - b; });

将项目作为数字进行比较,而不是按字符串和列表按升序排序。 => 2 < 10

此外,

weight = weight.sort(function(a,b){return b-a});

将按降序排序。

答案 1 :(得分:1)

我们通常使用这种排序来实现某种自定义比较。在这种情况下,仅调用sort的唯一区别是元素的顺序 - 使用您显示的代码,数组将按降序排序(从大值到小值),而不是典型的递增顺序。

请注意,无参数排序将返回b-a而不是符号不同的a-b,从而反转比较。

答案 2 :(得分:1)

没有自定义排序功能的

Array.prototype.sort会对lexicographical order中的项目进行排序。

您可以使用其任何属性定义自定义函数以对任何类型的项目进行排序。只需确保函数根据比较结果返回负数/正数或0。例如,要根据名称对具有name属性的对象进行排序,可以使用:

items.sort(function (a, b) {
    return a.name.localeCompare(b.name);
});

或者按照priority属性(编号)对项目进行排序:

items.sort(function (a, b) {
    return a.priority - b.priority;
});

在自定义排序器中,您可以根据需要比较任意数量的属性。还要确保正常处理未定义的项目或项目属性。一个强化的按名称排序的例子:

items.sort(function (a, b) {
    var aName = a && a.name || "",
        bName = b && b.name || "";
    return aName.localeCompare(bName);
});