我试图按降序排序生成10到1000之间的随机数组。
这是我写的代码:
function GenerateRandomArray(){
var array = [];
for (var i = 0; i < 10; i++) {
array[i] = Math.round(Math.random() * (1000 - 10 + 1) + 10);
}
return array.sort().reverse();
}
在终端中运行时,我得到的结果如下:
new GenerateRandomArray()=&gt; [924,804, 79 ,788,585,451,267,217,153,135]
new GenerateRandomArray()=&gt; [869,697,647, 59 ,458, 30 ,291,157,112,111]
new GenerateRandomArray()=&gt; [999, 98 ,872,823,705,418,404,306,259,20]
new GenerateRandomArray()=&gt; [688,666,664,615,580,565,336,304,250,246]
new GenerateRandomArray()=&gt; [912,906,759,690,673,481,429,355,19,103]
为什么某些数组的格式正确,而其他一些中间有一个非有序数字?
我测试过:
这并没有改变奇怪的结果。
我是否遗漏了类似JS强制性财产的东西?
谢谢:)
答案 0 :(得分:3)
默认情况下,sort
函数按字母数字/字母顺序排序(即“字符串排序”)。当字符串出现时,“aaa”出现在“b”之前,类似地“111”出现在“2”之前。
要按数值排序,您可以提供自己的比较功能。
array.sort(function(a, b) {
return a - b;
});
答案 1 :(得分:1)
使用
return array.sort(function(a, b) {
return a - b;
}).reverse();
或简单地说:
return array.sort(function(a, b) {
return b - a;
});
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
默认排序顺序是根据字符串Unicode代码点。
如果未提供compareFunction,则通过将元素转换为字符串并按Unicode代码点顺序比较字符串来对元素进行排序。例如,“香蕉”出现在“樱桃”之前。在数字排序中,9出现在80之前,但由于数字被转换为字符串,因此“80”以Unicode顺序出现在“9”之前。
要比较数字而不是字符串,比较函数可以简单地从a中减去b。
这是一个返回随机数组(已排序)的函数,因此它不应与new
关键字一起使用,因为您没有将它用作构造函数。此外,个人偏好,我可能已将功能命名为getRandomNumberArray
或getArrayOfRandomNumbers
。
答案 2 :(得分:1)
function GenerateRandomArray(){
var arr = [];
for (var i = 0; i < 10; i++) {
arr.push(Math.round(Math.random() * 1000));
}
arr.sort(function compareNumbers(a, b) {
return a - b;
});
return arr;
}