Здравствуйте, я надеюсь, что кто-то сможет дать мне отзыв о моем решении этой проблемы. Если есть дополнительные крайние случаи, я должен рассмотреть и т. Д. Спасибо!
Вопрос: «Для предложения с набором разделителей измените порядок слов в предложении и оставьте разделители на месте».
let isAlpha = (char) => {
let pat = /[a-zA-z]/igm; // match any alphabetic character
if(char.match(pat)){
return true
} else {
return false
}
}
function reverse(s){
let specialArr = []
for(ltr of s){
if(!isAlpha(ltr)){ // pull out all special characters in order
specialArr.push(ltr)
}
}
let regCharArr = s.split(/[^a-z]/ig).reverse() // use split to pull out all words separated by non alpha characters. then reverse
let result = [] // init result array
if(isAlpha(s[0])){
result = regCharArr.flatMap((val, idx) => [val, specialArr[idx]]) //use flatmap to combine the two arrays...if origin array starts with letter, combine special array into reg array
}
if(!isAlpha(s[0])){
result = specialArr.flatMap((val, idx) => [val, regCharArr[idx]]) // vice versa
}
for(let i = 0; i < result.length; i++){ // remove any undefineds
if(result[i] === undefined){
result.splice(i, 1)
}
}
return result.join('')
}
// let sentence = "one|twotwo/three:four" // four|three/twotwo:one
let sentence = "|brian/steve:chris|jon" // |jon/chris:steve|brian
console.log(reverse(sentence))
```
1 ответ
Текущая реализация isAlpha
…
let isAlpha = (char) => {
// match any alphabetic character.
let pat = /[a-zA-z]/igm;
if(char.match(pat)){
return true;
} else {
return false;
}
};
… можно реорганизовать во что-то вроде этого …
function isAlpha(char) {
return (/[a-zA-z]/).test(char);
};
… а может даже это …
function isAlpha(char) {
// w matches any word character
// and is equal to [a-zA-Z0-9_]
return (/w/).test(char);
};
Почему это?
isAlpha
вызывается изнутри reverse
всегда предоставляя один символ. Таким образом, регулярное выражение можно упростить с /[a-zA-z]/igm
к /[a-zA-z]/
. С isAlpha
должен возвращать логическое значение не использовать match
и не возвращайся тоже true
или же false
отдельно, но используйте RegExp.prototype.test
вместо этого, который уже предоставляет правильное возвращаемое значение.
На этом пока все, но я продолжу просматривать код, так как на данный момент я не понимаю, почему нужно тестировать строку пошагово символ за символом.
Есть мой ответ на ваш вопрос в StackOverflow. Может быть, вас вдохновит альтернативный подход.