尝试从一个我知道只包含整数的数组中获取最高和最低值似乎比我想象的更难。
var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)
我希望它展示的是99, 104, 140000
,但实际上它展示的是104, 140000, 99
。因此看起来排序函数将这些值视为字符串。
有没有办法让排序函数按照整数值进行排序?
尝试从一个我知道只包含整数的数组中获取最高和最低值似乎比我想象的更难。
var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)
我希望它展示的是99, 104, 140000
,但实际上它展示的是104, 140000, 99
。因此看起来排序函数将这些值视为字符串。
有没有办法让排序函数按照整数值进行排序?
function sortNumber(a,b) {
return a - b;
}
var numArray = [140000, 104, 99];
numArray.sort(function(a, b) {
return a - b;
});
console.log(numArray);
文档:
在不包含Infinity或NaN的数组中,Mozilla Array.prototype.sort()
推荐使用此比较函数。(因为 Infinity - Infinity
不是0,而是 NaN)。
还有按键排序对象的示例。
numberArray.sort((a, b) => (a - b));
太好了!我认为这很接近开箱即用的方式。注意:请检查您的JS引擎是否支持箭头函数。 - Константин Ван继承以上所有答案,它们也可以像这样在一行中完成:
var numArray = [140000, 104, 99];
numArray = numArray.sort(function (a, b) { return a - b; });
//outputs: 99, 104, 140000
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
或者更简洁的ES6写法:let arr = [140000, 104, 99].sort((a,b) => a-b);
- 00500005我很惊讶为什么每个人都推荐给sort()
传递一个比较函数,这会使排序变慢。
要对数字进行排序,只需创建任意的TypedArray:
var numArray = new Float64Array([140000, 104, 99]);
numArray = numArray.sort();
console.log(numArray)
array.sort默认使用词典排序,如果需要进行数字排序,请提供自己的函数。以下是一个简单的示例:
function compareNumbers(a, b)
{
return a - b;
}
numArray.sort(compareNumbers);
还要注意,sort方法会直接在原对象上进行排序,不需要进行赋值操作。
只需使用.sort((a, b) => a - b)
而不是.sort()
本身。此外,该数组会在原地排序,因此返回值并不重要。
var numArray = [140000, 104, 99];
numArray.sort((a, b) => a - b);
console.log(numArray)
来自文档:
根据每个字符的Unicode代码点值,按照每个元素的字符串转换对数组进行排序。
如果打印数组的Unicode代码点值,则问题将变得清晰。
console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));
//Note that we only look at the first index of the number "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));
//Note that we only look at the first index of the number "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先出现。
So the final result will be:
var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)
104, 140000, 99
结论:
sort()
只根据数字的第一位进行排序,不关心整个数字的大小,它比较数字中每个字符的unicode值大小,如果两个unicode值相等,则会检查下一个数字并进行比较。
要正确排序,您必须像这里所解释的那样传递一个比较函数给sort()
。
升序 (Ascending)
arr.sort((a, b) => a - b);
降序排列
arr.sort((a, b) => b - a);
只是为了好玩:
降序 = 升序 + 反转
arr.sort((a, b) => a - b).reverse();
我同意aks的观点,不过我们可以改用
return a - b;
你应该使用
return a > b ? 1 : a < b ? -1 : 0;
>
和 <
仍将 a 和 b 视为字符串进行比较。 - vriesdemichaela - b
无法正确评估的数字返回正确的结果。当 a = b = -Infinity
时,a - b = NaN
,但是三元运算符返回了 0
。但是这似乎并不影响排序,它仍然可以完美地实现。 (a > b) - (a < b)
是一个更短的版本,与这个三元运算符等价。 - Artyer