javascript - 从句子中的每个单词中删除最后一个元音 javascript
问题描述
编写一个函数,删除句子中每个单词的最后一个元音。
例子:
removeLastVowel("Those who dare to fail miserably can achieve greatly.") ➞ "Thos wh dar t fal miserbly cn achiev gretly." removeLastVowel("Love is a serious mental disease.") ➞ "Lov s serios mentl diseas" removeLastVowel("Get busy living or get busy dying.") ➞ "Gt bsy livng r gt bsy dyng"
我正在做的是
function sumDigProd(arr) {
let ans = arr.split(" ");
let array = [];
for (i = 0; i < ans.length; i++) {
for (j = 0; j < ans[i].length; j++) {
var vowelAtLast;
if (
ans[i][j].toLowerCase() == "a" ||
ans[i][j].toLowerCase() == "e" ||
ans[i][j].toLowerCase() == "i" ||
ans[i][j].toLowerCase() == "o" ||
ans[i][j].toLowerCase() == "u"
) {
vowelAtLast = ans[i][j];
}
}
var idex = ans[i].lastIndexOf(vowelAtLast);
console.log(idex,ans[i],ans[i][idex]);
ans[i].replace(ans[i][idex],'')
array.push(ans[i])
console.log(ans)
}
console.log(ans)
return array.join(" ");
}
console.log(sumDigProd("youuo goalo people."));
在这里,console.log(idex,ans[i],ans[i][idex]);
给了我正确的输出,例如:
4 "youuo" "o"
但是现在当我尝试这样做时:
ans[i].replace(ans[i][idex],'')
console.log(ans)
我明白了
["youuo", "goalo", "people."]
相反,我应该得到
["youu", "goalo", "people."]
在第一次循环运行之后......最后我得到的输出为
["youu", "goal", "peopl."]
根据问题,但我得到
["youuo", "goalo", "people."]
为什么这里的方法没有改变replace
?
解决方案
一个问题是
ans[i].replace(ans[i][idex], '')
只会替换第一次出现的任何字符ans[i][idex]
。例如
aza
会导致
za
另一个问题是您必须使用 的返回值.replace
,否则它将被闲置且无关紧要;你想要类似的东西
ans[i] = ans[i].replace(ans[i][idex], '')
相反,以便正确重新分配数组中该索引处的项目。
但是使用正则表达式可能更容易:匹配一个元音,然后在捕获组中捕获零个或多个非元音,前瞻匹配空格或字符串的末尾。然后替换为第一个捕获组,从而删除最后一个元音:
const sumDigProd = str => str.replace(
/[aeiou]([^aeiou]*?)(?= |$)/gi,
'$1'
);
console.log(sumDigProd("youuo goalo people."));
[aeiou]([^aeiou]*?)(?= |$)
方法:
[aeiou]
- 任何元音([^aeiou]*?)
- 匹配和捕获:[^aeiou]*?
任何非元音,惰性(捕获组),直到
(?= |$)
-lookahead 匹配一个空格或字符串的结尾
然后
'$1'
- 替换为捕获组
要更改原始代码,请通过从字符串的最终索引迭代并向后移动来识别元音的最后一个索引。找到一个后,重新分配字符串 atans[i]
和.slice
ing 找到的元音后面和前面的部分:
function sumDigProd(arr) {
let ans = arr.split(" ");
for (i = 0; i < ans.length; i++) {
for (j = ans[i].length - 1; j >= 0; j--) {
if (
ans[i][j].toLowerCase() == "a" ||
ans[i][j].toLowerCase() == "e" ||
ans[i][j].toLowerCase() == "i" ||
ans[i][j].toLowerCase() == "o" ||
ans[i][j].toLowerCase() == "u"
) {
ans[i] = ans[i].slice(0, j) + ans[i].slice(j + 1);
// go to next word
break;
}
}
}
return ans.join(' ');
}
console.log(sumDigProd("youuo goalo people."));
推荐阅读
- excel - 自动关闭工作簿
- python - python matplotlib中带有过滤条的交互式散点图
- sinch - 在后台接收 Sinch 消息和呼叫,并显示传入消息的通知并显示呼叫覆盖
- tig - 如何在 tig 中保存 refs 视图排序
- pycharm - 在 PyCharm 中搜索“TODO”不起作用
- swift - 如何使`ReadMoreTextView`库中的`attributedReadMoreText`不可选择-swift
- ios - 如何在swift4中解析对象内的数组内的json对象
- csv - awk 分成随机子集
- javascript - 对 rollup.js 外部使用 glob 或正则表达式模式
- java - 通过 Writer 写入数百万个字符串会成为 Java 字符串池的内存和性能问题吗?