9
function SimpleSymbols(str) { 
    var letter =['a','b','c','d','e','f','g','h','i','j',
    'k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

    var newstr = "";
    for (var i = 0; i<str.length; i++){
        if (str.charAt(i).toLowerCase() in letter){
            newstr += "M";
        }
        else{
            newstr += "X";
        }
    }

return newstr; 

}

str が「ここに引数を入れる」の場合、XXXXXXXXX を返します。MMMMMMMMMM が返されないのはなぜですか?

4

3 に答える 3

10

で配列内のエントリを検索しませんinindexOf()配列エントリの位置を見つけるために使用します。indexOf()位置を返す-1か、エントリが見つからない場合。

for (var i = 0; i<str.length; i++){
    var strChar = str.charAt(i).toLowerCase();

    if ( letter.indexOf(strChar) >= 0 ) {
        newstr += "M";
    }
…
于 2014-08-25T16:12:24.973 に答える
4

このin演算子は、オブジェクトがその値ではなくその名前trueのプロパティを持っているかどうかを返します。

配列は基本的に、数値プロパティを持つオブジェクトです。つまり、インデックスはオブジェクトのプロパティ名です。基本的には次のようになります。

var letters = {
  0: 'a',
  1: 'b',
  ...
  length: ...
};

したがって、あなたの場合、条件は と の間の数値を返す場合のみになります(trueそして、1文字しか返さないため、 のみにすることができます)。str.charAt(i).toLowerCase()0letter.lengthcharAt0-9

例:

> var letters = ['a', 'b', 'c'];
> 'a' in letters // array doesn't have a property 'a'
false
> 0 in letters   // array has a property 0 (it's the first element)
true

したがって、"Argument goes here"数字が含まれていないため、in条件は常にあり、それが結果としてfalse得られる理由ですXXXXXX...

配列内の要素の存在をテストするには、「配列に JavaScript のオブジェクトが含まれているかどうかを確認するにはどうすればよいですか? 」という質問を参照してください。


FWIW、inオペレーターを機能させるには、次の形式のオブジェクトを作成する必要があります。

var letters = {
  'a': true,
  'b': true,
  // ...
};

しかし、それを書くのは少し面倒です。

于 2014-08-25T16:15:24.583 に答える
0

別の方法として、次のような正規表現を使用して、あなたが意図していると思われることを処理します。

"test2".replace(/[a-z]/gi,"M").replace(/[^M]/g,"X") //Outputs "MMMMX"

String.replaceは、式の末尾に大文字と小文字が区別されないことを意味するから[a-z]の文字を含む文字列を置き換えます。ig は、最初の一致だけでなく、考えられるすべての一致を検索することを意味します。2 番目の式では[^M]、これ^は否定を意味するため、ではないものはMすべて に置き換えられXます。

正規表現を使用してカスタム関数を実装する別の方法があり、次のString.replaceように実装できます。

"test2".replace(/([a-z])|([^a-z])/gi,
     function(m,g1, g2){ 
            return g1 ? "M" : "X";  
     });

正規表現では、括弧はグループと | を作成します。または、この表現([a-z])|([^a-z])では、1 つは az からの文字を含む 2 つのグループであり、もう 1 つは、置換機能を使用しないすべてのものを意味a-zします。g1MX

もう 1 つのクールな方法は、次のようにプロトタイプを作成して、この関数をすべての文字列に追加することです。

String.prototype.traverse = function(){ return this.replace(/([a-z])|([^a-z])/gi,function(m,g1){ return g1 ? "M" : "X"  });}

次に、次のように簡単に使用できます。"test1".traverse();

于 2014-08-25T18:30:29.947 に答える