介绍.sort
可用于按特定顺序对数组进行排序的方法,本教程的目的是解释如果要正确排序整数数组,为什么此方法需要比较函数。
这个比较函数将决定排序顺序。此外,我们将解释如何使用它进行降序排序,以及通过将比较函数用作方法中的箭头函数来一起使用它的更短.sort
方法。
目录
1..sort使用方法对JavaScript 中的整数数组进行排序
2.将比较函数作为参数传递
3.使用箭头函数对JavaScript中的整数数组进行排序
该.sort
方法是Array
从最初调用此方法的数组返回有序数组的实体方法。例如:
// Input
let array = [10, 10000, 1000, 100, 1]
console.log(array.sort())
输出:
// Output
[ 1, 10, 100, 1000, 10000 ]
当然,这是预期的,因为该.sort
方法对数组进行排序。但是,如果我们有以下输入:
// Input
let array = [12900, 877, 12, 992, 10000]
console.log(array.sort())
我们有这样的错误顺序:
// Output
[ 10000, 12, 12900, 877, 992 ]
发生这种情况是因为.sort默认顺序基于UTF-16
or 16-bit Unit Transformation Format
,它是 Unicode 模式的编码。该方法将数组值转换为字符串类型,然后对它们的 Unicode 值进行排序。
通过这个解释,该.sort
方法还可以用于对其他数据类型进行排序,而不仅仅是数字。
但是如何.sort
使用该方法正确排序数组呢?很简单:通过使用比较函数。
由于该.sort
方法可以在没有任何参数的情况下使用,因此比较函数是可选的。基本上,这个函数定义了.sort
方法顺序,这个函数接收两个参数:第一个要比较的元素和第二个要比较的元素。
该.sort
方法将:
first
后面;second
compareFunction
first
前面;second
compareFunction
compareFunction
返回值等于 0,则不执行任何操作。因此,对于,我们可以通过在和参数compareFunction(first, second)
之间传递一个操作来指定排序顺序。升序排列,first
second
// Ascending ordering
function compareFunction(first, second){
if(first > second) return 1 // 1 is greater than 0, so .sort will put first after second.
if(first < second) return -1 // -1 is less than 0, so .sort will put first before second.
return 0
}
现在,将compareFunction
升序与.sort
方法放在一起,最后,我们有:
// Input:
let array = [12900, 877, 12, 992, 10000]
// Ascending
array.sort(function compareFunction(first, second){
if(first > second) return 1 // 1 is greater than 0, so .sort will put first before second.
if(first < second) return -1 // -1 is less than 0, so .sort will put first after second.
return 0
})
console.log(array)
输出:
// Output:
[ 12, 877, 992, 10000, 12900 ]
我们还可以使用箭头函数将所有代码块减少到最少的语法。
箭头函数是另一种使用语法较短的函数的方法。箭头函数是匿名函数,这意味着它们没有命名(存储在变量中或作为函数参数传递)并且不能在所有情况下使用。
使用箭头函数的结构,可以将传统函数转换为更短的块,例如:
// Common anonymous function
function (x){
return x + 1;
}
// Arrow function
(x) => x + 1
除此之外,箭头函数的结构可以自动返回不带保留字的表达式值return
:
// Arrow function
let arrowFunction = (x) => x + 1
console.log(arrowFunction(1))
输出:
//Output
2
打印的console.log()
值1 + 1
,2
即使arrowFunction
不使用该return
语句。它将帮助我们进行下一步。
如前所述,.sort
方法中可以有一个比较函数,这个函数可以是一个箭头函数。转换之前的比较函数结构,我们可以将所有代码块转换为更短的块,如下所示:
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => {
if(first > second) return 1
return -1
})
// Ascending: If first > second == true, then change one by the other.
console.log(array)
我们可以放弃条件,相反,如果主要条件不是这种情况,则first < second
返回一个默认值;-1
假设该方法的0
值.sort
是相等的值,这样,他们可以在不影响最终结果的情况下改变他们的位置。这样,我们可以减少更多,如下例所示:
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first > second ? 1 : -1)
// Ascending: If first > second == true, then change one by the other.
console.log(array)
查看之前的>
比较和默认return
更改为只有一个比较:first > second ? 1 : -1
。这意味着如果比较是true
,则返回1
;如果不是,它返回-1
。
我们需要?
三元运算符,因为first > second
比较结果只会是true
or false
。但如前所述,该.sort
方法需要1
,-1
或0
。
输出:
// Output:
[ 1, 10, 100, 1000, 10000 ]
对于降序:
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first < second ? 1 : -1)
// Descending: If first < second == true, then change one by the other.
console.log(array)
输出:
// Output:
[ 10000, 1000, 100, 10, 1 ]
另一种方法是使用-
三元运算符进行减法。当我们使用array.sort((first, second) => first > second ? 1 : -1)
时,如果first - second
result 的值大于 0,那么将是一个相互变化的索引。如果first - second
result 的值小于 0,则什么也不会发生,对于相等的值,比较将返回0
。
例子:
// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => first - second))
输出:
// Output:
[ 1, 10, 100, 1000, 10000 ]
我们可以按降序做什么?不,它没有将-
三元运算符更改为,+
因为每个正数加上另一个正数都会导致值大于 0。但是我们有一个简单的解决方案:将first - second
to反转second - first
。
这样,如果second - first
结果值大于 0,则 .sort 方法将相互改变它们的位置。
例子:
// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => second - first))
输出:
// Output:
[ 10000, 1000, 100, 10, 1 ]