为什么javascript的排序功能不能很好地工作?
这个简单的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]);
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));