这个sort()
方法按字母顺序对数组进行排序:
这个reverse()
方法反转数组中的元素。
您可以使用它对数组进行降序排序:
默认情况下,sort()
函数将值排序为字符串。
这对于字符串非常有效("Apple" 位于 "Banana" 之前)。
但是,如果数字按字符串排序,则"25" 大于"100",因为"2" 大于"1"。
正因为如此,sort()
对数字进行排序时,该方法会产生不正确的结果。
您可以通过提供来解决此问题比较功能:
使用相同的技巧对数组进行降序排序:
比较函数的目的是定义替代排序顺序。
比较函数应返回负值、零值或正值,具体取决于参数:
function(a, b){return a - b}
当。。。的时候sort()
函数比较两个值,它将值发送到比较函数,并根据返回的(负、零、正)值对值进行排序。
如果结果是否定的,a
之前已排序b
。
如果结果呈阳性,b
之前已排序a
。
如果结果为 0,则两个值的排序顺序不会发生任何更改。
例子:
比较函数比较数组中的所有值,一次比较两个值(a, b)
。
比较 40 和 100 时,sort()
方法调用比较函数(40, 100)。
该函数计算 40 - 100(a - b)
,并且由于结果为负数 (-60),因此排序函数会将 40 排序为小于 100 的值。
您可以使用此代码片段来尝试按数字和字母顺序排序:
<button onclick="myFunction1()">Sort Alphabetically</button>
<button onclick="myFunction2()">Sort Numerically</button>
<p id="demo"></p>
<script>
const points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;
function myFunction1() {
points.sort();
document.getElementById("demo").innerHTML = points;
}
function myFunction2() {
points.sort(function(a, b){return a - b});
document.getElementById("demo").innerHTML = points;
}
</script>
亲自试一试 »
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(){return 0.5 - Math.random()});
上面的例子,数组.sort(),不准确。它将有利于某些数字而不是其他数字。
最流行的正确方法称为 Fisher Yates shuffle,早在 1938 年就被引入数据科学中!
在 JavaScript 中,该方法可以翻译为:
const points = [40, 100, 1, 5, 25, 10];
for (let i = points.length -1; i > 0; i--) {
let j = Math.floor(Math.random() * (i+1));
let k = points[i];
points[i] = points[j];
points[j] = k;
}
没有用于查找数组中的最大值或最小值的内置函数。
但是,对数组进行排序后,可以使用索引来获取最高值和最低值。
升序排序:
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// now points[0] contains the lowest value
// and points[points.length-1] contains the highest value
亲自试一试 »
降序排序:
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// now points[0] contains the highest value
// and points[points.length-1] contains the lowest value
亲自试一试 »
如果您只想找到最高(或最低)值,则对整个数组进行排序是一种非常低效的方法。
您可以使用Math.max.apply
查找数组中的最大数字:
Math.max.apply(null, [1, 2, 3])
相当于Math.max(1, 2, 3)
。
您可以使用Math.min.apply
查找数组中最小的数字:
Math.min.apply(null, [1, 2, 3])
相当于Math.min(1, 2, 3)
。
最快的解决方案是使用 "home made" 方法。
此函数循环遍历一个数组,将每个值与找到的最高值进行比较:
function myArrayMax(arr) {
let len = arr.length;
let max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
}
此函数循环遍历一个数组,将每个值与找到的最小值进行比较:
function myArrayMin(arr) {
let len = arr.length;
let min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
}
JavaScript 数组通常包含对象:
const cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}
];
即使对象具有不同数据类型的属性,sort()
方法可用于对数组进行排序。
解决方案是编写一个比较函数来比较属性值:
比较字符串属性有点复杂:
cars.sort(function(a, b){
let x = a.type.toLowerCase();
let y = b.type.toLowerCase();
if (x < y) {return -1;}
if (x > y) {return 1;}
return 0;
});
亲自试一试 »
ES2019修改阵列sort()
方法。
在 2019 年之前,规范允许不稳定的排序算法,例如 QuickSort。
ES2019之后,浏览器必须使用稳定的排序算法:
当对某个值的元素进行排序时,这些元素必须保持其与具有相同值的其他元素的相对位置。
const myArr = [
{name:"X00",price:100 },
{name:"X01",price:100 },
{name:"X02",price:100 },
{name:"X03",price:100 },
{name:"X04",price:110 },
{name:"X05",price:110 },
{name:"X06",price:110 },
{name:"X07",price:110 }
];
亲自试一试 »
在上面的例子中,当按价格排序时,结果不允许出现在其他相对位置的名称,如下所示:
X01 100
X03 100
X00 100
X03 100
X05 110
X04 110
X06 110
X07 110
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!