我的意图是建立一个简单的过程,可以将单词分解为音节。该方法是在元音出现时拆分单词。然而,麻烦在于当辅音后面没有元音时,在这种情况下,该辅音发生分裂。

我的测试用例如下:

hair = ["hair"]
hairai = ["hai", "rai"]
hatred = ["hat", "red"]


在第一个示例中,头发是一个音节,因为最终辅音后没有元音,类似地,在最后一个示例中,“ t”后跟有r,因此应将“ ha”视为一个音节。
在第二个示例中,ai被视为一个元音,因此hai将成为一个音节。

更多示例包括

father = ["fat", "her"]
kid = ["kid"]
lady = ["la","dy"]


请注意,我使用的是简单的示例,因为英语在声音方面非常复杂

我的代码如下



function syllabify(input) {
  var arrs = [];
  for (var i in input) {
    var st = '';
    var curr = input[i];
    var nxt = input[i + 1];
    if ((curr == 'a') || (curr == 'e') || (curr == 'i') || (curr == 'o') || (curr == 'u')) {
      st += curr;
    } else {
      if ((nxt == 'a') || (nxt == 'e') || (nxt == 'i') || (nxt == 'o') || (nxt == 'u')) {
        st += nxt;
      } else {
        arrs.push(st);
        st = '';
      }
    }
  }
  console.log(arrs);
}

syllabify('hatred')





但是,我的代码甚至没有返回字符串。我究竟做错了什么?

最佳答案

您目前的方法存在问题

您的代码有很多问题:


循环中的第一件事,就是将st设置为空字符串。这意味着您永远不会积累任何字母。您可能希望在循环之外位于上方的那条线。
您正在尝试使用i in input遍历字母索引。在JavaScript中,in关键字为您提供对象的键作为字符串。这样就得到了字符串,而不是数字,以及字符串上定义的某些方法的名称。请尝试使用var i = 0; i < input.length; i++
可能不是问题的直接原因,但仍然-您的代码很混乱。这些怎么样?


使用更清晰的名称。 currentSyllable代替stsyllables代替arrs,依此类推。
代替嵌套的if-else,使用一个if-else if-else
您重复相同的代码两次检查元音。而是将其分离为功能isVowel(letter)



一种新方法

使用regular expressions!这是您对以正则表达式表示的音节的定义:


首先,零个或多个辅音:[^aeiouy]*
然后,一个或多个元音:[aeiouy]+
之后,为零或以下之一:


辅音,然后以单词结尾:[^aeiouy]*$
一个辅音(如果后面跟着另一个辅音):[^aeiouy](?=[^aeiouy])



综合起来,您会得到:

/[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi


您可以在操作here中看到它。要在JavaScript中运行它,请使用match函数:



const syllableRegex = /[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi;

function syllabify(words) {
    return words.match(syllableRegex);
}

console.log(['away', 'hair', 'halter', 'hairspray', 'father', 'lady', 'kid'].map(syllabify))





请注意,这对于没有元音的单词不起作用。您可能需要修改正则表达式以适应这种情况,或者执行其他一些解决方法。

10-07 21:27