2

巨大な文字列を通過するループがあります。各数字を別の文字列の個々の数字と照合し、一致するものを強調表示します...

var decypher = "782137829431783498892347847823784728934782389";

var systemPass = "789544";

for (var x = 0; x < decypher.length; x++) { //loop through the array
    var switcher = 0; //not run this row yet
    for (var p = 0; p < systemPass.length; p++) { //loop through each digit in the password
        if(eval(decypher[x]) === eval(systemPass[p])) { //if the password digit matches the array digit
            if (switcher === 0) { //not run yet...
                $('body').append("<p style='color: green; float: left;'>"+decypher[x]+"</p>");
                switcher = 1; //finished running
            }
        } else { //no match
            if (switcher === 0) { //not run yet...
                $('body').append("<p style='color: silver; float: left;'>"+decypher[x]+"</p>");
                switcher = 1; //finished running
            }
        } 
    }   
}

JSFiddle の例: http://jsfiddle.net/neuroflux/J4wbk/12/

私の質問は、なぜそれがこれまで強調表示されているの7'sですか? 私はこれについて何年もの間頭を悩ませてきました!

[編集]
「@Yograj Gupta」のおかげで -switcher変数を削除しましたが、各文字の複数のインスタンスを取得するようになりました: http://jsfiddle.net/neuroflux/J4wbk/22/

4

6 に答える 6

6

まあ、あなたは間違いなくこれを難しい方法でやっています。代わりに使用indexOfします(または、ヨハンが指摘したようにjQuery.inArray):

http://jsfiddle.net/CrossEye/euGLn/1/

var decypher = "782137829431783498892347847823784728934782389";
var systemPass = "789544";

for (var x = 0; x < decypher.length; x++) {
    // if(systemPass.indexOf(decypher[x]) > -1) { // Thanks, Johan
    if ($.inArray(decypher[x], systemPass) > -1) {
        $('body').append("<p style='color: green; float: left;'>"+decypher[x]+"</p>");
    } else { //no match
        $('body').append("<p style='color: silver; float: left;'>"+decypher[x]+"</p>");
    } 
}

ここで推奨するクリーンアップは他にもたくさんありますが、少なくともループの方が簡単です。

-- スコット

于 2012-09-26T11:35:28.830 に答える
1

このような?それとも私は何かを逃しましたか?

var decypher = "782137829431783498892347847823784728934782389".split('');

var systemPass = "789544".split('');

$.each(decypher, function(i, v){

    if(systemPass.indexOf(v) !== -1)
        $('body').append("<p style='color: green; float: left;'>"+ v +"</p>");
    else
        $('body').append("<p style='color: silver; float: left;'>"+ v +"</p>");

});

http://jsfiddle.net/J4wbk/22/

于 2012-09-26T11:36:44.233 に答える
1

最初の反復で内側のループで switcher = 1 を作成しているため、7 のみが表示されます。

したがって、7 になると、systemPass 変数の 0 インデックスに 7 が存在するため、最初の繰り返しで存在を確認し、緑色で表示します。しかし、それ以外の場合はシルバーで表示され、スイッチャーはそこで 1 になります。

したがって、値を indexOf 関数と照合する必要があります。

于 2012-09-26T11:33:18.423 に答える
1

これをチェックしてください... http://jsfiddle.net/J4wbk/26/

これが役立つと思います

説明: 内側のループ内で switcher = 1 を割り当てています。そのため、最初の一致の後、switcher は 1 になり、常に else 部分が実行されます。また、内部ループ内の復号化にすべての文字を追加しているため、複数の文字を取得しており、systemPass.length 回追加されています。

于 2012-09-26T11:45:10.397 に答える
0

このフィドルを確認してください:http://jsfiddle.net/2HvwT/2/

注:Scott Sauyetによって提案されたように、indexOf()でフィドルを更新しました

コード:

for (var x = 0; x < decypher.length; x++) { //loop through the array
    var found = systemPass.indexOf(decypher[x]);
    $('body').append("<p style='color: "+(found !== -1?'green':'silver')+"; float: left;'>"+decypher[x]+"</p>");
}
于 2012-09-26T11:36:34.773 に答える
0

私はあなたのjsfiddle に変更を加えました。コードを更新しました。これで問題が解決するはずです

var decypher = "782137829431783498892347847823784728934782389";

    var pass = 789544;
    pass = "" + pass; var temp = '';
    for(var k =0; k < pass.length; k++){
      temp += pass[k] + '|';
    }
    temp = temp.substring(0, temp.length-1) ;

    console.log(new RegExp(temp,'g'));

    document.body.innerHTML =decypher.replace(new RegExp(temp,'g'), function(a){

        return '<span>'+a + '</span>';

    });

​
于 2012-09-26T11:29:44.407 に答える