在 JavaScript 中对整数数组进行排序

介绍.sort可用于按特定顺序对数组进行排序的方法,本教程的目的是解释如果要正确排序整数数组,为什么此方法需要比较函数。

这个比较函数将决定排序顺序。此外,我们将解释如何使用它进行降序排序,以及通过将比较函数用作方法中的箭头函数来一起使用它的更短.sort方法。

目录

1..sort使用方法对JavaScript 中的整数数组进行排序

2.将比较函数作为参数传递

3.使用箭头函数对JavaScript中的整数数组进行排序


1..sort使用方法对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-16or 16-bit Unit Transformation Format,它是 Unicode 模式的编码。该方法将数组值转换为字符串类型,然后对它们的 Unicode 值进行排序。

通过这个解释,该.sort方法还可以用于对其他数据类型进行排序,而不仅仅是数字。

但是如何.sort使用该方法正确排序数组呢?很简单:通过使用比较函数。

2.将比较函数作为参数传递

由于该.sort方法可以在没有任何参数的情况下使用,因此比较函数是可选的。基本上,这个函数定义了.sort方法顺序,这个函数接收两个参数:第一个要比较的元素和第二个要比较的元素。

.sort方法将:

  • 如果返回值大于 0,则放在first后面;secondcompareFunction
  • 如果返回值小于 0,则放在first前面;secondcompareFunction
  • 如果compareFunction返回值等于 0,则不执行任何操作。

因此,对于,我们可以通过在和参数compareFunction(first, second)之间传递一个操作来指定排序顺序。升序排列,firstsecond

// 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 ]

3.使用箭头函数对JavaScript中的整数数组进行排序

我们还可以使用箭头函数将所有代码块减少到最少的语法。

箭头函数是另一种使用语法较短的函数的方法。箭头函数是匿名函数,这意味着它们没有命名(存储在变量中或作为函数参数传递)并且不能在所有情况下使用。

使用箭头函数的结构,可以将传统函数转换为更短的块,例如:

// 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 + 12即使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比较结果只会是trueor false。但如前所述,该.sort方法需要1,-10

输出:

// 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 - secondresult 的值大于 0,那么将是一个相互变化的索引。如果first - secondresult 的值小于 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 - secondto反转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 ]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值