1

Codecademy で JavaScript を学んでいますが、問題があります。以下のコードは、text変数内の my name を変数内で検索しmyName、個々の文字をすべてhits配列にプッシュすることになっています。私が書いたコードは正しくありませんが、Codecademy は正しいと言っており、レッスンを続けさせてくれます。

私は運が悪いという問題を解決しようとしています。問題は、hits.push(text);行を実行すると変数全体が出力されることですがhits.push(text[i]);、結果を未定義にしようとしました。誰かが私がどこで間違いを犯したかを理解するのを手伝ってもらえますか?

/*jshint multistr:true */
var text = "XsddfasASSFABrandonSFsdfdasBrandonsddfadfaBrandon";
var myName = "Brandon";
var hits = [];
for (i=0; i<=text.length;i++){
    if (text[i]===myName[i]){
        for(var x=i; x<i+myName.length;x++){
            hits.push(text);
        }
    }
}
if (hits.length===0){
    console.log("Your name wasn't found!");
} else {
    console.log(hits);
}
4

4 に答える 4

2

通常、この種のことは、すべて文字列メソッドindexOfであるmatch、、、またはを使用して行います。searchsubstrsubstring

ただし、この演習では、次のことができます。

var text = "XsddfasASSFABrandonSFsdfdasBrandonsddfadfaBrandon";
var myName = "Brandon";
var hits = [],
    namePosition = 0;
for (var i = 0; i < text.length; i++) {
    if (text[i] === myName[namePosition]) {
        hits.push(text[i]);
        namePosition ++;
        if (hits.length === myName.length) {
            break;
        }
    }
    else {
        namePosition = 0;
        hits = [];
    }
}
if (hits.length === 0) {
    console.log("Your name wasn't found!");
} else {
    console.log(hits);
}​

http://jsfiddle.net/wCWxr/1/で動作していることを確認してください)。元のコードの問題には次のものがあります。

  1. 比較しようとしtext[i]ましmyName[i]たが、2 つの文字列のインデックスが一致しません。

  2. 一度に1文字ではなく、文字列全体をプッシュしようとしtextますhits

  3. あなたのロジックは、テキストが aerwerBrasdfsgars である場合など、 の始まりで終わりでmyNameはない可能性を処理していませんtext

私の提案namePositionは、 string 内の現在の位置を ( で)記録し、 内の関連する文字と一致する内の文字myNameを見つけたときにそれをインクリメントすることで、これを修正します。文字が一致しない場合は真のヒットではないため、リセットして. 文字がすべて一致する場合、最終的に and の長さに達するため、ループから抜け出します。textmyNamehits = []namePosition = 0hitsmyName

于 2012-12-09T18:04:15.270 に答える
2

あなたの間違いを説明する最善の方法は、あなたが書いたものの論理を少し説明することです.

for (i=0; i<=text.length;i++){

ループは、変数にある文字数と同じ数だけfor繰り返されるため、49 回です。itext

if (text[i]===myName[i]){

forループの最初の実行では、が と厳密に等しいi=0かどうかを確認しています。と。厳密に等しい条件が満たされないため、ループはrepeat:とのインクリメントに進みます。これがさらに 47 回続き、条件が満たされることはありません。最初の 7 回のループの後は未定義です。text[0]myName[0]text[0] = XmyName[0] = Bitext[1] = smyName[1] = rmyName[i]

于 2012-12-09T18:06:39.703 に答える
0
if (text[i]===myName[i]){  

myName[i] は myName の最初の文字ではないため、この行でエラーが発生するはずです。

if (text[i]===myName[0]){

この行に変更するとうまくいくはずです。

于 2014-05-18T15:18:59.190 に答える
0

myName がテキスト内にあるかどうかを確認しようとしている場合は、次のようにします。

正規表現:

var pattern = new RegExp(myName);
if (pattern.test(text)){
    console.log(myName);
}else {
    console.log("Your name wasn't found!");
}

の指標:

if (text.indexOf(myName) != -1){
    console.log(myName);
}else {
    console.log("Your name wasn't found!");
}
于 2012-12-09T17:59:32.397 に答える