反转字符串中的单词
给定一个字符串,反转字符串中的每个单词的字符顺序,同时保留空格和单词的初始顺序。
示例:
输入:“Let's take LeetCode contest”
输出:"s'teL ekat edoCteeL tsetnoc"
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格
版本1:
export default (str) => {
// 字符串按空格进行分隔,保存数组,数组的元素的先后顺序就是单词的顺序
let arr = str.split(' ')
// 对数组进行遍历,然后每个元素进行反转
let result = arr.map(item => {
// 下面一行的split和join的参数都是没有空格的
return item.split('').reverse().join('')
})
return result.join(' ')
}
书写测试代码
import revertByWorld from '../../code/string/lesson1'
// 用test声明测试用例,然后expect是期望执行的函数并传参,toBe是期望获得的结果
test('revertByWorld:Let\'s take LeetCode contest', () => {
expect(revertByWorld("Let's take LeetCode contest")).toBe("s'teL ekat edoCteeL tsetnoc")
})
运行指令npm test
运行代码
如果测试不通过,也就是执行了expect的代码,并没有获得toBe的结果,命令行工具会报错,并会通过Expected和Received信息明确提示报错的原因,根据原因 ,就可以很轻松的对错误进行修改。
版本1的代码虽然看上去逻辑清晰,且运行正常,但是不够优雅,接下来对版本1的代码进行优化
下面是减少了变量的声明,充分体现链式编程思想的版本2
export default (str) => {
// 1. 字符串按空格进行分隔,保存数组,数组的元素的先后顺序就是单词的顺序
// 2. 对数组进行遍历,然后每个元素进行反转
return str.split(' ').map(item => {
return item.split('').reverse().join('')
}).join(' ')
}
还有没有别的思路呢?
split方法的参数可以是字符串常量,也可以是正则表达式,所以进行以下改变
版本3
export default (str) => {
return str.split(/\s/g).map(item => {
return item.split('').reverse().join('')
}).join(' ')
}
还可以考虑在一开始的处理中,不适用split方法,而是用match
JavaScript match() 方法
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。
- 返回值
存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。
无g只执行一次匹配,有g则返回所有匹配到的元素形成的数组。
版本4
export default (str) => {
return str.match(/[\w']+/g).map(item => {
return item.split('').reverse().join('')
}).join(' ')
}