试图从一个只包含整数的数组中获得最大值和最小值似乎比我想象的要难。
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。看起来排序是把值当做字符串处理的。
有没有办法让排序函数对整数值进行排序?
当前回答
排序函数的行为如此怪异的原因
从文档中可以看到:
[…数组根据每个字符的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()传递一个比较函数,就像这里解释的那样。
其他回答
As sort方法将数组元素转换为字符串。因此,下面的方法也适用于十进制数的数组元素。
let productPrices = [10.33, 2.55, 1.06, 5.77];
console.log(productPrices.sort((a,b)=>a-b));
并给出预期结果。
我同意aks,但是不用
return a - b;
你应该使用
return a > b ? 1 : a < b ? -1 : 0;
对整数> 0排序,跳出框框思考:
函数sortArray(arr) { return new Promise((resolve) => { Const result = [] arr.forEach((item) => { setTimeout(() => { result.push(项) 如果结果。长度== arrr . Length) resolve(result) },项) }) }) } sortArray([4,2, 42岁,128年,56岁的2]),然后((结果)= > { document . write (JSON.stringify(结果)) })
请注意,这不应该有效地使用,.sort()更适合于此,检查其他答案
当数组只包含没有无穷大或NaN的数字时,接受的答案和类似numArray.sort((a,b) => a - b)的等价物是很好的。它们可以被扩展到处理无穷大和NaN,如下所示:
numArray.sort((a,b) => (+a || 0) - (+b || 0) || 0);
这将NaN(或任何非数字,如'foo'或{})排序为0。最后的|| 0需要处理a和b等于无穷大的情况。
如果你需要从字符串列表中计算和排序最大的charCodeAt,这是正确的方法。
const arrayLines = '1.1.1.1\n1.0.1.1\n1.1.1.2\n1.1.1.0'.split('\n');
// Response: (4) ['1.0.1.1', '1.1.1.0', '1.1.1.1', '1.1.1.2']
arrayLines.sort((a, b) => {
let a_charCodeSize = 0,
b_charCodeSize = 0;
// Loop true a & b characters and calculate the charCodeAt size.
for (const aChar of a) a_charCodeSize += aChar.charCodeAt(0);
for (const bChar of b) b_charCodeSize += bChar.charCodeAt(0);
return a_charCodeSize - b_charCodeSize;
});