我遇到过这个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
。
我想知道a
和b
在幕后是如何工作的。我找不到详细解释这种排序方式的来源。我想逐步了解sort
何时投入使用;这将使我更好地了解上面的代码是如何工作的。
我们将感谢您的帮助。
详细信息可以在规范中找到。基本上,sort
的工作原理是重复调用回调来比较数组中的两个条目。如果a
"小于"b
(根据特定回调想要应用的规则"小于"的含义(,回调应该返回-1,如果它们相同,则返回0,如果a
"大于"b
则返回1。它继续这样做,使用数组中的不同条目对,直到对数组进行排序。
sort
如何做到这一点取决于实现,规范中没有规定。规范中规定的所有内容都是上面的段落,并且(截至最近(排序必须稳定。
关于您显示的特定代码的几个注意事项:
arr
应为第一行中的nums
map
调用没有意义,数组中的条目已经是字符串- 它所做的比较是字母
sort
方法编码错误,因为如果a
和b
相同,则返回-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);