Javascript poem-generator-将子字符串与数组中的任何单个元素进行匹配

我不知道如何写这个问题的标题,因为这是一个很多步骤的问题!

一些背景:我正在尝试结合我在英语文学和语法方面的背景,我喜欢“喜欢繁殖”的模因诗,以及我新兴的javascript知识来创造一个“喜欢繁殖”的诗歌生成器.

基本上,用户输入单音节名称/名词,并且基于该单词,押韵诗将产生.第一位的逻辑如下:

>第一步:获取用户的输入
>第二步:弄清楚用户的输入时间(此步骤可能实际上不是必需的)
>第三步:找到第一个元音(只有包含“y”,如果它是唯一的元音
元音 – 或者,如果是最后一个字母,只包括“y”
>第四步:选择包括之后的所有字母
元音
>第五步:将这些字母与可能的结尾押韵进行比较

问题是,我不知道如何处理第三步和第四步. (我对使用jQuery或javascript库的解决方案持开放态度,但是因为我还是初学者,所以除了从头开始编写任何东西外,我还没有多大的分支.

注意:如果长度的上限是有帮助的,那么九个字符是有意义的,因为英语中最长的单音节字是9个字母长.

我的第一个想法是做一个条件语句,如:

var noun = document.getElementById('noun').value; // noun input by user
var n = noun.str.length; // length of unknown word
var place = 0
var firstVow; // location of first vowel
while (place < 10) { 
// can you even do nested while loops/conditionals like this?
    if (noun.charAt(place) == 'a' ||
        noun.charAt(place) == 'e' ||
        noun.charAt(place) == 'i' ||
        noun.charAt(place) == 'o' ||
        noun.charAt(place) == 'u'|| 
        noun.charAt(n) == 'y') {
           firstVow = noun.indexOf(place);}
    else {
        place++;
    }
}
 var numSel = n - firstVow; // number of characters to select equals string length minus location of the first vowel
 var nounSel = noun.substr(firstVow, numSel); // selection to compare to end-rhymes

在理论上(至少我认为 – 如果我错了,请纠正我),这让我发现第一次a / e / i / o / u / word-terminal-y出现,然后拉子串与各种结尾的韵律相比……但后来我迷失了.

我正在编制一个可能的结尾押韵列表,但我不确定如何将它们与子串进行比较(它们将会有很多,特别是拼写不同的那些).如果我为每个押韵声音创建一个变量,并使用不同拼写的数组,有没有办法检查字符串是否匹配数组中的任何一个元素?如果可能的话,我试图避免使用具有一百个或更多条件的条件语句.

任何帮助或批评都是最受欢迎的!

编辑示例:

我所说的“可能的结尾押韵列表”的一些例子:

>“ay”,如“bay”:[ay,eigh,ei]
>“我”,如“by”:[y,eye,aye,ye]
>“啊”,如“锯”:[a,啊,aw]
>“ot”,如“bot”:[ot,ott,should,aught]

使用示例的逻辑工作:

>先决条件:用户输入:“Scott”
>第1步:获取用户输入[结果:“Scott”]
>第2步:查找用户输入的长度[结果:5个字符长,也就是位置0-4]
>步骤3:找到第一个元音的位置[结果:第一个元音在第2个位置为“o”]
>步骤4:选择包含该元音后的所有字母[结果:返回子字符串“ott”]
>步骤5:将子字符串与可能的结尾押韵/拼写进行比较(结果:返回“ot”结尾韵的变量匹配)
>步骤6:将第3行,第5行和第7行的终端词选择限制为具有“ot”结束押韵的单词子集[注意:这将是已经使用该押韵方案识别的预选词库]

我的主要障碍是将选定的子字符串“ott”与我可能的结尾韵律集合进行比较.如果我安排了这样的结尾韵:

var ay = ["ay", "eigh", "ei"];
var eye = ["y", "eye", "aye", "ye"];
var ah = ["a", "ah", "aw"];
var ot = ["ot", "ott", "ought", "aught"];

然后可以检查子串是否匹配数组中的任何一个选项?这可能是我可以使用正则表达式的另一个地方吗?

最佳答案 为了得到一个结尾,你可以使用一个正则表达式,它可以查找零个或多个元音后跟元音或y以及字符串的结尾或一组元音后跟非元音和字符串的结尾.

function getEnding(word) {
    return (word.match(/[aeiou]*[aeiouy]$|[aeiou]+[^aeiou]+$/) || [''])[0];
}

console.log(['scott', 'bay', 'by', 'saw', 'bot', 'uncaught'].map(getEnding));
点赞