为什么javascript的排序功能不能正常工作?

时间:2011-05-23 06:59:33

标签: javascript arrays sorting

这个简单的javascript

var x = new Array();
x[0] = 2.73;
x[1] = 11.17;
x[2] = 3.12
x.sort();

for(var i in x)
    alert(x[i]);

产生结果: 11.17, 2.73, 3.12代替2.73, 3.12, 11.17

为什么会这样,我该如何解决?

提前致谢!

5 个答案:

答案 0 :(得分:16)

按字母顺序排序,尝试传递自己的排序功能:

var x = new Array();
x[0] = 2.73;
x[1] = 11.17;
x[2] = 3.12;

numberSort = function (a,b) {
    return a - b;
};

x.sort(numberSort);

for(var i in x) {
    alert(x[i]);
}

答案 1 :(得分:9)

默认情况下,Array.sort将按字母顺序(以词汇方式)排序......但您可以提供自己的功能。尝试:

x.sort(function(a, b) { return a > b ? 1 : -1});

答案 2 :(得分:3)

在他们之间,现有的答案告诉你一切,但他们都没有提到代码中的两个问题。这是完整的答案:

排序不是你想要的,因为默认排序是词法的(即数组元素被转换为字符串并按字母顺序进行比较)。您可以为sort()提供自己的比较功能:

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

其次,for...in实际上并没有告诉您关于数组是否正确排序的具体内容,因为for...in的枚举未定义(即使大多数但并非所有浏览器都广泛地执行您的操作)期望)。改为使用for循环(实际上通常应该用于数组):

for (var i = 0, len = x.length; i < len; ++i) {
    alert(x[i]);
}

答案 3 :(得分:1)

您没有正确迭代。它应该是:

for (var i = 0; i < x.length; i++) {
    alert(x[i]);
}

当你在javascript中使用for..in时,这将遍历对象的属性,并且迭代的顺序是未定义的。您应该看到一些奇怪的输出,例如Array类中定义的所有函数。

答案 4 :(得分:0)

Array.sort()函数将其元素视为字符串,如果没有函数传递给sort()语句,它会将元素转换为Unicode并进行排序。因此,建议在对数字进行排序时传递自定义排序函数。

function customSort(a, b){
     return a - b; 
}
console.log([-11,-2, 0 ,100].sort(customSort));

此customSort()函数将按升序对数组in_place进行排序。