Task&Rules:
Give you an array ```arr``` that contains some string elements, reverse all things in the array.
an example:
```
["abc123!@#\n314159","987bbc\n#$%\nxyz886"]
```
Follow the example above, we learning how to reverse every things:
1) reverse array index:
```
["abc123!@#\n314159","987bbc\n#$%\nxyz886"]
to:
["987bbc\n#$%\nxyz886","abc123!@#\n314159"]
```
2) Each element is a string that separated by "\n", reverse it:
```
["987bbc\n#$%\nxyz886","abc123!@#\n314159"]
to
["xyz886\n#$%\n987bbc","314159\nabc123!@#"]
```
3) The splited string may contains three kinds chars: letters, numbers, others. reverse them one by one:
```
["xyz886\n#$%\n987bbc","314159\nabc123!@#"]
to
["zyx688\n%$#\n789cbb","951413\ncba321#@!"]
```
ok, return the result.
根据要求,前面的操作十分简单。首先,将反转数组元素的顺序,然后将每个元素以"\n"分割为数组,反转元素顺序,再按照一定规则进行下一步反转。将字符按照数字、字母及非数字字母的规则,进行最细化的顺序反转。选择replace()方法,将"xyz"、"886"、"!@#"类似的字符串分割为数组然后反转元素顺序。
replace(/[a-zA-Z]*/g, e => e.split('').reverse().join(''))
replace(/[0-9]*/g, e => e.split('').reverse().join(''))
replace(/[^a-zA-Z0-9]*/g, e => e.split('').reverse().join(''))
最终如下代码:
const reverseAll = arr =>
arr.reverse()
.map((a)=>a.split('\n')
.reverse()
.map((a)=>a.replace(/[a-zA-Z]*/g, e => e.split('').reverse().join(''))
.replace(/[0-9]*/g, e => e.split('').reverse().join(''))
.replace(/[^a-zA-Z0-9]*/g, e => e.split('').reverse().join('')))
.join('\n'))
再贴一段他人的代码,从内部开始反转操作。
function reverseAll(arr){
const regex = /[a-zA-Z]+|[0-9]+|[\W_]+/g
return arr.map(row =>
row.split('\n').map(i =>
i.match(regex).map(r =>
r.split('').reverse().join('')
).join('')
).reverse().join('\n')
).reverse();
}