试图从一个只包含整数的数组中获得最大值和最小值似乎比我想象的要难。
var numArray = [140000, 104, 99]; numArray = numArray.sort(); console.log(numArray)
我希望这是99 104 140000。相反,它显示的是104、14万、99。看起来排序是把值当做字符串处理的。
有没有办法让排序函数对整数值进行排序?
试图从一个只包含整数的数组中获得最大值和最小值似乎比我想象的要难。
var numArray = [140000, 104, 99]; numArray = numArray.sort(); console.log(numArray)
我希望这是99 104 140000。相反,它显示的是104、14万、99。看起来排序是把值当做字符串处理的。
有没有办法让排序函数对整数值进行排序?
当前回答
当数组只包含没有无穷大或NaN的数字时,接受的答案和类似numArray.sort((a,b) => a - b)的等价物是很好的。它们可以被扩展到处理无穷大和NaN,如下所示:
numArray.sort((a,b) => (+a || 0) - (+b || 0) || 0);
这将NaN(或任何非数字,如'foo'或{})排序为0。最后的|| 0需要处理a和b等于无穷大的情况。
其他回答
Let grade =[80,100,50,90,40]; grade.sort ((x, y) = > x - y); grade.forEach(元素= > console.log(元素));
数组中。Sort默认执行字典排序,对于数字排序,提供自己的函数。这里有一个简单的例子:
function compareNumbers(a, b)
{
return a - b;
}
numArray.sort(compareNumbers);
还要注意,排序是“就地”工作的,不需要赋值。
下面的'numerically'函数作为回调函数提供时,在许多情况下用于对数字数组进行数字排序:
function numerically(a, b){
return a-b;
}
array.sort(numerically);
但在一些罕见的情况下,数组包含非常大的负数,当a-b小于JavaScript可以处理的最小数字时,可能会发生溢出错误。
所以用数字表示函数的更好方法如下:
function numerically(a, b){
if(a < b){
return -1;
} else if(a > b){
return 1;
} else {
return 0;
}
}
我同意aks,但是不用
return a - b;
你应该使用
return a > b ? 1 : a < b ? -1 : 0;
排序函数的行为如此怪异的原因
从文档中可以看到:
[…数组根据每个字符的Unicode码位排序 值,根据字符串转换每个元素。
如果你打印数组的unicode点值,那么它就会被清除。
console.log(“140000”.charCodeAt (0)); console.log(“104”.charCodeAt (0)); console.log(“99”.charCodeAt (0)); //请注意,我们只查看数字charCodeAt(0)的第一个索引
返回:“49,49,57”。
49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)
现在,因为140000和104返回了相同的值(49),它切断了第一个索引并再次检查:
console.log(“40000”.charCodeAt (0)); console.log(“04”.charCodeAt (0)); //请注意,我们只查看数字charCodeAt(0)的第一个索引
52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)
如果我们对这个进行排序,那么我们会得到:
40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)
所以104在140000之前。
所以最终的结果是: var numArray = [140000, 104,99]; numArray = numArray.sort(); console.log (numArray)
104, 140,000, 99
结论:
Sort()仅通过查看数字的第一个索引来排序。Sort()并不关心一个整数是否比另一个大,它比较数字的unicode值,如果有两个相同的unicode值,那么它检查是否有下一个数字并进行比较。
要正确排序,必须向sort()传递一个比较函数,就像这里解释的那样。