我的意图是建立一个简单的过程,可以将单词分解为音节。该方法是在元音出现时拆分单词。然而,麻烦在于当辅音后面没有元音时,在这种情况下,该辅音发生分裂。
我的测试用例如下:
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
代替st
,syllables
代替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))
请注意,这对于没有元音的单词不起作用。您可能需要修改正则表达式以适应这种情况,或者执行其他一些解决方法。