0

私はJavascript のディクショナリ ルックアップ(セクション「クライアント側のソリューション」を参照) で詳細に説明されているアプローチを使用して、scrabble ディクショナリ内の各単語のプロパティを含むオブジェクトを作成しています。

var dict = {};

//ajax call to read dictionary.txt file
$.get("dictionary.txt", parseResults);


function parseResults(txt) {
var words = txt.split( "\n");

  for (var i=0; i < words.length; i++){
      dict[ words[i] ] = true;
  }

  console.log(dict.AAH);
  console.log(dict);

  if (dict.AAH == true) {
     console.log('dict.AAH is true!');
  }


}

(Phil からの以前の回答を使用するようにコードを更新)

dict.AAH が undefined を返す理由がわかりませんが、dict オブジェクトはコンソールで問題なく表示されます。以下の Firebug のスクリーンショット。

コンソール:

コンソール

「オブジェクト { }」にドリルダウン

物体

指定された単語 (この場合は "AAH") をチェックし、それが true として定義された dict オブジェクトのプロパティである場合に true を返すにはどうすればよいですか?

4

5 に答える 5

1

Get ajax リクエストは非同期です。これは、ajax リクエストで発生する操作全体が進行している間、javascript が次の行を読み続けることを意味します。

問題は、ajax リクエストが十分に早く取得できなかった値をログに記録していることです。

この問題を回避するには、次のように ajax リクエスト コールバック内にログ呼び出しを含めることができます。

var dict = {};

//ajax call to read dictionary.txt file
$.get("dictionary.txt", function( txt ){
    var words = txt.split( "\n");

    for (var i=0; i < words.length; i++){
        dict[ words[i] ] = true;
    }

    //Now inside these console.log will run once you DO have the data
    console.log(dict.AAH);
    console.log(dict);
});

//ここにあるものは、非同期リクエストが終了したかどうかに関係なく実行されます

このタイプのシナリオでは、最善の解決策として、JQuery で when メソッドを使用することをお勧めします。

複雑なプロジェクトに最も適していると思われる方法は次のとおりです

var dict = {};

//ajax call to read dictionary.txt file
function getDictionary(){
    return $.ajax("dictionary.txt");
}

/*I recommend this technique because this will allow you to easily extend your 
code to maybe way for more than one ajax request in the future. You can stack 
as many asynchronous operations as you want inside the when statement*/

$.when(getDictionary()).then(function(txt){//Added txt here...forgot callback param before

   var words = txt.split( "\n");

    for (var i=0; i < words.length; i++){
        dict[ words[i] ] = true;
    }

    //Now inside these console.log will run once you DO have the data
    console.log(dict.AAH);
    console.log(dict);
});
于 2012-09-15T17:35:55.380 に答える
1

おそらく競合状態です。ディクショナリをロードするGETとすぐに (リクエストが行われている間)、これらの console.log コマンドが呼び出されます (そして、未定義のコマンドが返されます)。その後、デバッグするまでにデータが実際にロードされます。すべてをコールバックまたは遅延で行う必要があります。これは、以前に私を捕まえたデバッガーの理解できる癖です。

于 2012-09-15T17:10:28.950 に答える
1

成功ハンドラーdictによって入力される前に出力しようとしています。$.get

これを試して:

// If the browser doesn't have String.trim() available, add it...
if (!String.prototype.trim) {
    String.prototype.trim=function(){return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');};

    String.prototype.ltrim=function(){return this.replace(/^\s+/,'');};

    String.prototype.rtrim=function(){return this.replace(/\s+$/,'');};

    String.prototype.fulltrim=function(){return this.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ');};
}

/**
 * Parses the response returned by the AJAX call
 *
 * Response parsing logic must be executed only after the
 * response has been received. To do so, we have to encapsulate
 * it in a function and use it as a onSuccess callback when we
 * place our AJAX call.
 **/
function parseResults(txt) {
    // clean the words when we split the txt
    var words = txt.split("\n").map($.trim);

    for (var i=0; i < words.length; i++){
        dict[ words[i] ] = true;
    }

    console.log(dict.AAH);
    console.log(dict);

    if (dict.AAH == true) {
       console.log('dict.AAH is true!');
    }
}

// global object containing retrieved words.
var dict = {};

//ajax call to read dictionary.txt file
$.get("dictionary.txt", parseResults);

別のユーザーがコメントしたように、jQuery の$.whenを使用すると、そのようなコードをチェーンできます。

ちなみに、単語が結果に含まれているかどうかを知りたいだけの場合は、次のことができます。

function parseResults(txt) {
    // clean the words when we split the txt
    var words = txt.split("\n").map($.trim);

    if ($.inArray('AAH', words)) {
        console.log('AAH is in the result set');
    }
}
于 2012-09-15T17:11:42.797 に答える
1

問題はあなたのコードではありません。あなたの言葉には目に見えない文字があり、それを片付けることができません。

これを結果パーサーとして使用することでこれを確認できます

function parseResults(txt) {
  // clean the words when we split the txt
  var words = txt.split("\n")
                 .map($.trim)
                 .splice(0,3); // Keep only 3 first ones

  if(btoa(words[2]) !== btoa('AAH')){ // Compare in Base64
    console.log('YOU HAVE HIDDEN CHARS!');
  }

}

また、キャラクターをホワイトリストに登録することで修正できます。

function parseResults(txt) {
  // clean the words when we split the txt
  var words = txt.split("\n").map(function(el){
    return el.match(/[a-zA-Z0-9]/g).join('');
  });

  for (var i=0; i < words.length; i++){
      dict[ words[i] ] = true;
  }

  console.log(dict.AAH);
  console.log(dict);

  if (dict.AAH == true) {
     console.log('dict.AAH is true!');
  }
}

サーバー側でクリーンアップすることをお勧めします。実際のサイトで見られるのと同じくらい大きい配列内のすべての要素に対して正規表現を実行すると、パフォーマンスの問題が発生する可能性があるためです。

于 2012-09-26T16:51:00.680 に答える