2016-10-24 8 views
0

このプログラムは、特定のキー&の値を検索するネストされたオブジェクトを読み取っています。このデータが見つかると、データを返送するコールバックを開始する必要があります。オブジェクトは、次のようになります。可変スコープとコールバックの悲惨

{ 
    "name": "joel", 
    "title": "CTO", 
    "edu": { 
     "school": "RMB", 
     "college": "GNK", 
     "pg": "CDAC", 
     "extract": "This is a large text ..." 
    } 
} 

をここに私は、私が理解することはできませんよ、同期プログラミングの背景から来て、私は、コールバックを開始しても、変数がスコープ内にあることを保証しなければならないとき

function parseData(str, callback) { 

    function recursiveFunction(obj) { 
     var keysArray = Object.keys(obj); 

     for (var i = 0; i < keysArray.length; i++) { 
      var key = keysArray[i]; 
      var value = obj[key]; 

      if (value === Object(value)) { 
       recursiveFunction(value); 
      } 
      else { 
       if (key == 'title') { 
        var title = value; 
       } 

       if (key == 'extract') { 
        var extract = value.replace(/(\r\n|\n|\r)/gm," "); 
        callback(null, JSON.stringify({title: title, text: extract})); 
       } 
      } 
     } 
    } 

    recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract}))); 
}; 

たときに、このコードが実行されてエラーが発生する

/parseData.js:29 
    recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract}))); 
                  ^
ReferenceError: title is not defined 
+0

それはあなたの入力オブジェクトおよび所望の結果を見ることなく、この質問に答えることは非常に困難です。今のところ立っているように、この機能はあまり意味がありません。"ジョエル"、 "タイトル": "CTO"、 "EDU":{ "学校": "人民元"、 "大学" JSONデータ@Tomalak – Tomalak

+0

この { "名前" のようになります"GNK"、 "PG": "CDAC"、 "抽出物": "これは大きなテキスト..." }} 及び所望の結果が { "タイトル" になります " CTO "、 "抽出 ":"これは大きなテキストです... " } –

+0

希望の動作/結果は何ですか?関数が何をすべきかを指定していませんでした。また、以下のように@Svabaelが述べているように、これまでは非同期プログラミングとは関係がありませんでした。 – Tomalak

答えて

0

いいえ。したがって、これらのプロパティがどれくらい深くネストされていても、ネストされたオブジェクトからtitleという名前の最初のプロパティとextractという最初のプロパティを取得する関数が必要です。

「オブジェクトからプロパティ値を抽出する」というのは、基本的にはそれ自身のタスクであり、そのための関数を書くことができます。処理するために、3例があります

:オブジェクトに再帰、

  • それ以外の場合は関連付けられた値を返す - - 引数は、該当のキーが含まれていundefined
  • を返す

    1. 引数がオブジェクトではありません手順1と2を繰り返す - 結果に応じて返す

    function pluck(obj, searchKey) { 
        var val; 
    
        if (!obj || typeof obj !== "object") return; 
        if (obj.hasOwnProperty(searchKey)) return obj[searchKey]; 
        Object.keys(obj).forEach(function (key) { 
         if (val) return; 
         val = pluck(obj[key], searchKey); 
        }); 
        return val; 
    } 
    

    ここで、pluck()は任意のオブジェクトと任意のキーで呼び出すことができ、オブジェクト内のどこからでも最初に見つかる値を返します。

    は、今すぐあなたのタスクの残りの部分は非常に容易になる:

    var obj = { 
        "name": "joel", 
        "title": "CTO", 
        "edu": { 
         "school": "RMB", 
         "college": "GNK", 
         "pg": "CDAC", 
         "extract": "This is a large text ..." 
        } 
    } 
    
    var data = { 
        title: pluck(obj, "title"), 
        text: pluck(obj, "extract") 
    }; 
    
  • 0

    この機能は、非同期プログラミングとは何の関係もありません。私は、あなたが投稿したコードの塊の中で反応します。 recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract})));を呼び出すが、title変数がどこにも定義されていないために発生したエラーです。私はtitleの定義を見ることができますが、それはrecursiveFunctionの文脈の中にあります。そこで定義した変数は、その関数のスコープ外には表示されません。そのため、このエラーが発生します。あなたはこのラインで奇妙な何かをしようとしている

    recursiveFunction(str, callback(null, JSON.stringify({title: title, text: extract})));

    この行は、コールバックを呼び出しますし、recursiveFunctionでこの関数の結果を渡します。私はこの行に次のようなものがあると思うでしょう: recursiveFunction(str, callback);

    関連する問題