试图从一个只包含整数的数组中获得最大值和最小值似乎比我想象的要难。
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。看起来排序是把值当做字符串处理的。
有没有办法让排序函数对整数值进行排序?
当前回答
如果有人不理解Array.sort()如何处理整数,请阅读这个答案。
字母顺序排列:
默认情况下,sort()方法将值按字母和升序排列为字符串。
const myArray = [104, 140000, 99];
myArray.sort();
console.log(myArray); // output is [104, 140000, 99]
使用array.sort(compareFunction)的升序:
const myArray = [104, 140000, 99];
myArray.sort(function(a, b){
return a - b;
});
console.log(myArray); // output is [99, 104, 140000]
w3schools的解释:
compareFunction定义了一个可选的排序顺序。函数应该返回一个负的、零的或正的值,这取决于参数,比如: 函数(a, b){返回a-b} 当sort()方法比较两个值时,它将值发送给compare函数,并根据返回值(负、零、正)对值进行排序。 例子: 当比较40和100时,sort()方法调用compare 函数(40100)。 该函数计算40-100,并返回-60(负值)。 sort函数将把40排序为低于100的值。
使用array.sort(compareFunction)按降序排列:
const myArray = [104, 140000, 99];
myArray.sort(function(a, b){
return b - a;
});
console.log(myArray); // output is [140000, 104, 99]
这一次我们用b - a(即。, 100-40),返回正值。
其他回答
在JavaScript中,sort()方法的默认行为是对数组中的值按字母顺序排序。
要按数字排序,你必须定义一个数值排序函数(这很简单):
...
function sortNumber(a, b)
{
return a - b;
}
numArray = numArray.sort(sortNumber);
排序函数的行为如此怪异的原因
从文档中可以看到:
[…数组根据每个字符的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()传递一个比较函数,就像这里解释的那样。
数组中。Sort默认使用字母排序,而不是数字排序。
要支持数字,请添加如下的like
var numArray = [140000, 104, 99];
numArray.sort((a, b) => a - b); // <-- Ascending
numArray.sort((a, b) => b - a); // <-- Descending
console.log(numArray);
输出:
试试下面的代码:
HTML:
<div id="demo"></div>
JavaScript代码:
<script>
(function(){
var points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
points.sort(function(a, b){return a-b});
document.getElementById("demo").innerHTML = points;
})();
</script>
问题已经回答了,最短的方法是使用sort()方法。但如果你正在寻找更多的方法来排序你的数字数组,而且你也喜欢循环,请检查下面的方法
插入排序
上升: var numArray = [140000, 104, 99]; for (var i = 0; i < numArray.length; i++) { var target = numArray[i]; for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) { numArray[j+1] = numArray[j]; } numArray[j+1] = 目标 } console.log(numArray);
降:
var numArray = [140000, 104, 99]; for (var i = 0; i < numArray.length; i++) { var target = numArray[i]; for (var j = i - 1; j >= 0 && (numArray[j] < target); j--) { numArray[j+1] = numArray[j]; } numArray[j+1] = 目标 } console.log(numArray);
选择排序:
提升:
var numArray = [140000, 104, 99]; for (var i = 0; i < numArray.length - 1, i++) { var min = i; for (var j = i + 1; j < numArray.length; j++) { if (numArray[j] < numArray[min]) { 最小值 = j; } } if (min != i) { var target = numArray[i]; numArray[i] = numArray[min]; numArray[min] = 目标; } } console.log(numArray);
降:
var numArray = [140000, 104, 99]; for (var i = 0; i < numArray.length - 1, i++) { var min = i; for (var j = i + 1; j < numArray.length; j++) { if (numArray[j] > numArray[min]) { 最小值 = j; } } if (min != i) { var target = numArray[i]; numArray[i] = numArray[min]; numArray[min] = 目标; } } console.log(numArray);
玩得开心