1

if ステートメントのロジックに問題があります。文字列の文字がa、e、i、o、またはuと等しいかどうかを確認しようとしています。その場合は、その文字をフレーズ文字列に追加します。それ以外の場合は、フレーズ文字列に「x」を追加します。

if ステートメントは、OR ロジックを無視しているようで、not の母音であるかどうかに関係なく true を返します。

function translate(string){
    var phrase = "";

    for(i=0; i<string.length; i++){
        if (string.charAt(i) === "a" || "e" || "i" || "o" || "u"){
           phrase += string.charAt(i);

       }else{

            console.log("x");

         }
    }
    console.log(phrase);
}


translate("this is fun");

どんな助けでも大歓迎です!ありがとうございました。

4

5 に答える 5

5
if (string.charAt(i) === "a" || "e" || "i" || "o" || "u"){

これは正しくありません。最初の条件が失敗した (文字が でない"a") 場合、それはを評価するため、常にtrue"e"になります。これはtrue です(JavaScript は条件内の式の最後に評価された部分を返します)。

あなたが使用することができます...

// Define them somewhere out of the loop.
var vowels = ["a", "e", "i", "o", "u"];

// Your new condition.
if (vowels.indexOf(string.charAt(i)) > -1) {

全体を次のように書き換えることもできます...

var vowels = ["a", "e", "i", "o", "u"];
var phrase = string
              .split("")
              .filter(function(char) { return vowels.indexOf(char) > -1; })
              .join("");

jsFiddle .

于 2013-04-26T01:33:26.667 に答える
2

各条件を個別に確認する必要があります。例えば:

if (string.charAt(i) === "a" || string.charAt(i) === "e" || ...);

コードの肥大化を抑えるために、変数を設定できます。

var char = string.charAt(i);

if (char === "a" || char === "e" || ...);

indexOfまたは、次のトリックを使用できます。

if (["a", "e", "i", "o", "u"].indexOf(string.charAt(i)) > -1);
于 2013-04-26T01:34:34.817 に答える
1

このようにしてください。on 文字列は、on 配列.indexOf()よりも広く利用できます。.indexOf()

if ("aeiou".indexOf(string.charAt(i)) > -1) {
于 2013-04-26T01:47:11.010 に答える
1

あなたのコードでは、 which が と評価されると比較string.charAt(i)しています。"a" || "e" || "i" || "o" || "u"true

あなたがすべきことは次のとおりです。

string.charAt(i) === "a" || string.charAt(i) === "e" 
|| string.charAt(i) === "i" || string.charAt(i) === "o" || string.charAt(i) === "u"

英語では : と言いますif my string is equal to 'a' or 'e' or 'i' ..が、javascript (および他のほとんどの言語) では :if my string is equal to 'a' or my string is equal to 'b' ..

于 2013-04-26T01:34:00.453 に答える
1

アレックスの答えはかなり良いですが、indexOfと配列を使用するのではなく ( Array.prototype.indexOfは ES5 であるため、古いブラウザーではサポートされていないことに注意してください)、代わりにオブジェクトを使用できます。

var vowels = {a:'a', e:'e', i:'i', o:'o', u:'u'};

if (vowels.hasOwnProperty(string.charAt(i).toLowerCase())) {
    phrase += string.charAt(i);
} else {
    ...
}

上記も大文字と小文字が区別されないため、A、E、I、O、および U も文字列に追加されます。大文字と小文字を区別する場合は、その.toLowerCase()部分を削除します。

編集

アレックスはまた考えさせられました。母音のみの配列を順番に返すには:

function getVowels(s) {
  return s.match(/[aeiou]/g);
}

すべての非母音 (子音) が "x" に置き換えられた文字列を返すには:

function replaceConsonants(s) {
  return s.replace(/[^aeiou]/g,'x');
}

母音だけの文字列を返すには:

function replaceConsonants(s) {
  return s.replace(/[^aeiou]/g,'');
}

また

function getVowels(s) {
  return s.match(/[aeiou]/g).join('');
}

于 2013-04-26T02:04:19.923 に答える