1

我有一段代码会触发一些动作。在此之前,它只是对权重进行排序。当我使用时一切正常:weight.sort()where weightis an non-empty array eg [10 20 30 40],但是当我将其更改为:

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

其中一项操作无效(显示 div)。老实说,我不知道是什么导致了差异。这对我来说似乎很奇怪,因为weight在使用这两种方法进行排序并且清楚地更改那段代码后,我的脚本是否可以正常工作。FireBug 中没有错误。

4

3 回答 3

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});

将按降序排序。

于 2013-01-11T15:51:42.537 回答
1

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

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

于 2013-01-11T15:58:54.863 回答
1

Array.prototype.sort如果没有自定义排序功能,则按字典顺序对项目进行排序。

您可以定义自定义函数来使用它们的任何属性对任何类型的项目进行排序。只需确保函数根据您的比较结果返回负数/正数或 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);
});
于 2013-01-11T16:05:08.907 回答