为什么javascript的排序功能不能很好地工作?

为什么javascript的排序功能不能很好地工作?,javascript,arrays,sorting,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 这是为什么?我该如何修复它 提前谢谢 您没有正确迭代。应该是: for (var i = 0; i < x.length; i++) { alert(x[i]);

这个简单的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

这是为什么?我该如何修复它


提前谢谢

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

for (var i = 0; i < x.length; i++) {
    alert(x[i]);
}
当您在javascript中使用for..时,它将遍历对象的属性,并且迭代顺序未定义。您应该还会看到一些奇怪的输出,例如Array类中定义的所有函数。

默认情况下,Array.sort将按字母顺序排序…但您可以提供自己的函数。尝试:

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

它是按字母顺序排序的,请尝试传递您自己的排序函数:

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

在它们之间,现有的答案告诉了您一切,但没有一个同时提到代码中的这两个问题。以下是完整的答案:

排序没有达到您想要的效果,因为默认排序是词法排序,即数组元素被转换为字符串并按字母顺序进行比较。您可以提供自己的比较函数来排序:

其次,for…in实际上并没有具体告诉您数组是否正确排序,因为for…in的枚举并没有定义,即使大多数(但不是所有)浏览器都能大致实现您的预期。请使用for循环,就像您通常应该为数组使用的那样:

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

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

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

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

也可以写入返回a-b,因为只有返回值的符号才重要。@Max:听起来不错。在所有具有Array.sort的浏览器中都安全吗?@sje397:是的,安全。它在ECMAScript规范中是这样定义的,所有主要浏览器都是这样工作的。@sje397:我这么说,但实际上它并不完全安全:如果-b返回的数字大于number.MAX_值或小于-number.MAX_值,那么它可能会崩溃。不过有点像边缘案例。@Tim:details,details:坚持三元可能更安全。不管怎么说,它们都是濒危物种。这一部分绝对是可疑的,人们不应该出于这样的原因使用for…in for数组,但输入和输出表明,这并不会导致OP在其特定浏览器中的特定问题。数组实际上已排序,只是没有按预期排序。您还可以将es6语法与箭头函数一起使用:x.sorta,b=>a-b请注意,如果您有inifite或NaN值,则此方法将不起作用-在这种情况下,您可能需要。筛选NaN值,或使用更复杂的比较器逻辑,如下所示:
function customSort(a, b){
     return a - b; 
}
console.log([-11,-2, 0 ,100].sort(customSort));