有人能解释一下javascript排序方法是如何工作的吗



我遇到过这个javascript代码,它涉及一个带有自定义返回的sort方法。

const nums =  ['9', '5', '3', '34', '30' ];
const num = nums.map(n => n.toString()).sort((a,b) => a + b < b + a? 1: -1).join('')

从本质上讲,这段代码返回的是尽可能大的整数。我有排序的基本知识,如果你想让数字按升序排列,那么你会用a-b来返回。如果需要降序,则应使用b-a

我想知道ab在幕后是如何工作的。我找不到详细解释这种排序方式的来源。我想逐步了解sort何时投入使用;这将使我更好地了解上面的代码是如何工作的。

我们将感谢您的帮助。

详细信息可以在规范中找到。基本上,sort的工作原理是重复调用回调来比较数组中的两个条目。如果a"小于"b(根据特定回调想要应用的规则"小于"的含义(,回调应该返回-1,如果它们相同,则返回0,如果a"大于"b则返回1。它继续这样做,使用数组中的不同条目对,直到对数组进行排序。

sort如何做到这一点取决于实现,规范中没有规定。规范中规定的所有内容都是上面的段落,并且(截至最近(排序必须稳定。

关于您显示的特定代码的几个注意事项:

  • arr应为第一行中的nums
  • map调用没有意义,数组中的条目已经是字符串
  • 它所做的比较是字母
  • sort方法编码错误,因为如果ab相同,则返回-1,而不是0

您可以进行一个稍微不同的回调,它以不同的顺序添加两个值,并返回两者的delta。

它的工作原理是获得最终结果的部分字符串,并更改获得两项最大值的顺序。

例如,给定的数据在EDGE中按以下顺序排序:

a   b  b + a  a + b  delta  comment       array
--  --  -----  -----  -----  -------  --------------
3  5  9 30 34
3   5     53     35    -18  switch    5  3  9 30 34
3   9     93     39    -54  switch    5  9  3 30 34
5   9     95     59    -36  switch    9  5  3 30 34
3  30    303    330     27  keep      9  5  3 30 34
30  34   3430   3034   -396  switch    9  5  3 34 30
5  34    345    534    189  keep      9  5  3 34 30
3  34    343    334     -9  switch    9  5 34  3 30

const
array = ['3', '5', '9', '30', '34'],
result = array.sort((a, b) => (b + a) - (a + b)).join('');
console.log(...array);
console.log(result);

最新更新