首页 > 解决方案 > 从句子中的每个单词中删除最后一个元音 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

标签: javascript

解决方案


一个问题是

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].sliceing 找到的元音后面和前面的部分:

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."));


推荐阅读