Codewars按单词内数字排序问题:求解释正则排序逻辑
问题解答:根据单词中的数字排序字符串的JS函数解析
先整体梳理这个函数的执行流程:
words.split(' '):把输入的字符串按空格分割成单词数组。如果输入是空字符串,分割后得到[""],后续排序和拼接后依然是空字符串,符合题目要求。.sort(...):对单词数组按规则排序,这是核心逻辑。.join(' '):把排序后的数组重新拼接成空格分隔的字符串,作为结果返回。
核心:排序时的比较函数详解
排序函数里的function(a,b)是给数组的sort方法用的比较器,它的作用是告诉sort两个单词a和b谁应该排在前面,关键就在a.match(/\d/) - b.match(/\d/)这部分:
- 正则
/\d/的作用:\d是正则表达式里的元字符,用来匹配任意一个0-9的数字字符。题目明确每个单词里都包含一个1-9的数字,所以a.match(/\d/)会返回一个只包含这个数字的数组,比如单词Thi1s调用后返回["1"],is2调用后返回["2"]。 - 数字转换与比较:在JavaScript中,当数组和数字进行减法运算时,数组会先被转换为字符串(比如
["1"]变成"1"),然后自动转换成数字类型(1)。所以a.match(/\d/) - b.match(/\d/)本质就是拿a单词里的数字减去b单词里的数字。 - sort方法的规则:
sort方法根据比较函数的返回值决定顺序:- 如果返回负数,
a会排在b前面; - 如果返回正数,
b会排在a前面; - 返回0则保持两者相对位置不变。
这里用数字相减的结果做返回值,正好实现了按单词中的数字从小到大排序,完全符合题目中“数字代表单词位置”的要求。
- 如果返回负数,
举个实际例子,比如处理"is2 Thi1s T4est 3a"时:
- 分割后得到数组
["is2", "Thi1s", "T4est", "3a"] - 排序时,
Thi1s的数字是1,is2是2,1-2=-1,所以Thi1s排在is2前面; 3a的数字是3,is2的数字是2,2-3=-1,所以is2排在3a前面;- 最终排序后的数组是
["Thi1s", "is2", "3a", "T4est"],拼接后就是正确结果。
内容的提问来源于stack exchange,提问作者Kestone Dennis
相关产品推荐
相关产品推荐

