在javascript

时间:2018-03-21 10:02:57

标签: javascript jquery arrays string

我的目的是建立一个简单的过程,我可以用这个过程将单词分成音节。方法是在元音发生时分割单词。然而,问题是当辅音没有跟随元音时,在这种情况下,分裂发生在该辅音。

我的测试用例如下:

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

在第一个例子中,头发是一个音节,因为最后的辅音后面没有元音,类似地,在最后一个例子中," t"接下来是一个r,所以应该考虑" ha"作为一个音节。 在第二个例子中,ai被认为是一个元音,所以hai将成为一个音节。

更多例子包括

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

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

我的代码如下



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')




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

2 个答案:

答案 0 :(得分:2)

您当前方法的问题

您的代码存在许多问题:

  • 循环中的第一件事是,将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函数:

&#13;
&#13;
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))
&#13;
&#13;
&#13;

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

答案 1 :(得分:0)

我对RegEx的态度很虚弱,尽管在大多数情况下,安德斯(Anders)示例是正确的,但我确实发现了一些例外。到目前为止,这是我发现可以使用的功能(但是我敢肯定,还有其他例外情况尚未发现)。我相信它可以被艺术大师进行RegEx认证。此函数返回一个音节数组。

        function getSyllables(word){
        var response = [];
        var isSpecialCase = false;
        var nums = (word.match(/[aeiou]/gi) || []).length;
        //debugger;
        if (isSpecialCase == false && (word.match(/[0123456789]/gi) || []).length == word.length ){
            // has digits
            response.push(word);
            isSpecialCase = true;
        }

        if (isSpecialCase == false && word.length < 4){
            // three letters or less
            response.push(word);
            isSpecialCase = true;
        } 

        if (isSpecialCase == false && word.charAt(word.length-1) == "e"){
            if (isVowel(word.charAt(word.length-2)) == false){
                var cnt = (word.match(/[aeiou]/gi) || []).length;
                if (cnt == 3){
                    if (hasDoubleVowels(word)){
                        // words like "piece, fleece, grease"
                        response.push(word);
                        isSpecialCase = true;
                    }
                }
                if (cnt == 2){
                    // words like "phase, phrase, blaze, name", 
                    if (hasRecurringConsonant(word) == false) {
                    // but not like "syllable"
                    response.push(word);
                    isSpecialCase = true;
                    }

                }                    
            }
        }

        if (isSpecialCase == false){
            const syllableRegex = /[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi;
            response = word.match(syllableRegex);
        }

        return response;
    }