it-swarm.com.de

Wie überprüfe ich in JavaScript nach Vokalen?

Ich soll eine Funktion schreiben, die ein Zeichen annimmt (d. H. Eine Zeichenfolge der Länge 1) und true zurückgibt, wenn es ein Vokal ist, andernfalls false. Ich hatte zwei Funktionen, weiß aber nicht, welche die bessere Leistung bringt und welchen Weg ich bevorzugen sollte. Die mit RegEx ist viel einfacher, aber ich bin mir nicht sicher, ob ich RegEx vermeiden sollte oder nicht?

Mein Versuch ohne RegEx:

function isVowel(char)
{
  if (char.length == 1)
  {
    var vowels = new Array('a','e','i','o','u');
    var isVowel = false;

    for(e in vowels)
    {
      if(vowels[e] == char)
      {
        isVowel = true;
      }
    }

    return isVowel;
  }
}

Mit RegEx:

function isVowelRegEx(char)
{
  if (char.length == 1)
  {
    return /[aeiou]/.test(char);
  }
}
18
Max

Benchmark

Ich denke, man kann mit Sicherheit sagen, dass eine For-Schleife schneller ist.

Ich gebe zu, dass ein Regex-Code sauberer aussieht. Wenn es sich um einen echten Engpass handelt, verwenden Sie eine for-Schleife, ansonsten bleiben Sie aus Gründen der "Eleganz" beim regulären Ausdruck.

Wenn Sie auf Einfachheit gehen wollen, verwenden Sie einfach

function isVowel(c) {
    return ['a', 'e', 'i', 'o', 'u'].indexOf(c.toLowerCase()) !== -1
}
39
Raynos

Die Antworten sind hier verloren, die Geschwindigkeit ist für solche kleinen Funktionen irrelevant, es sei denn, Sie rufen sie in kurzer Zeit einige hunderttausend Mal an. Für mich ist ein regulärer Ausdruck am besten, aber bewahren Sie ihn in einer Schließung auf, damit Sie ihn nicht jedes Mal erstellen:

Einfache Version:

function vowelTest(s) {
  return (/^[aeiou]$/i).test(s);
}

Effizientere Version:

var vowelTest = (function() {
  var re = /^[aeiou]$/i;
  return function(s) {
    return re.test(s);
  }
})();

Gibt true zurück, wenn s ein einzelner Vokal (Groß- oder Kleinschreibung) und false für alles andere ist.

15
RobG

zyklen, Arrays, Regexp ... für was? Es kann viel schneller sein :)

function isVowel(char)
{
    return char === 'a' || char === 'e' || char === 'i' || char === 'o' || char === 'u' || false;
}
7
Emmerman

Dies ist eine grobe RegExp-Funktion, die ich mir ausgedacht hätte (es wurde nicht getestet)

function isVowel(char) {
    return /^[aeiou]$/.test(char.toLowerCase());
}

Was bedeutet if (char.length == 1 && 'aeiou' is contained in char.toLowerCase()) then return true.

3
Buhake Sindi

Persönlich würde ich es so definieren:

function isVowel( chr ){ return 'aeiou'.indexOf( chr[0].toLowerCase() ) !== -1 }

Sie können auch ['a','e','i','o','u'] verwenden und den Längentest überspringen, erstellen dann jedoch bei jedem Aufruf der Funktion ein Array. (Es gibt Möglichkeiten, dies über Verschlüsse nachzuahmen, aber diese sind etwas unklar zu lesen.)

3
cwallenpoole
function isVowel(char)
{
  if (char.length == 1)
  {
    var vowels = "aeiou";
    var isVowel = vowels.indexOf(char) >= 0 ? true : false;

    return isVowel;
  }
}

Grundsätzlich wird nach dem Index des Zeichens in der Vokalfolge gesucht. Wenn es sich um einen Konsonanten handelt und nicht in der Zeichenfolge, gibt indexOf den Wert -1 zurück.

1
Håvard

Ich mag diese Methode, die meiner Meinung nach alle Grundlagen abdeckt:

const matches = str.match(/aeiou/gi];
return matches ? matches.length : 0;
1
Intellidroid
function findVowels(str) {
  return (str.match(/[aeiou]/ig)||[]);
}

findVowels('abracadabra'); // 'aaaaa'

Im Grunde gibt es alle Vokale in einer gegebenen Zeichenfolge zurück.

0
José Salgado