2017-01-25 1 views
-1

角型JSでTypescriptを使用すると、ループ内に一時変数を作成して値を設定することがあります。 私はJSONレスポンスをループし、表示したい項目を決定しています。アイテムには、フロントエンドに表示されるかどうかを決定するいくつかの変数があります。 具体的には、調査用です。調査が完了していない場合にのみ有効な質問を表示したいが、回答が完了していれば回答がある質問を表示することができます(これらは「非アクティブ」[削除された質問])。Javascript:Forループでは、構造体の値または一時変数を明示的に設定する方が良いでしょうか?

例JSONレスポンス:

私のコントローラのレスポンスデータを扱う
{ 
    "surveyId": 2, 
    "completed": false 
    "questions" : [ { 
    "id" : 1111, 
    "question": "Blah blah blah blah ?", 
    "answer": null 
    }, 
    { 
    "id" : 1112, 
    "question" : "Yes no no no yes?", 
    "answer": 1, 
    "active": true 
} 

myService.getSurvey(vm.id) 
    .success(function(data: any) { 
    ... 
    let questionableJSON: {id: number, question: string, answer: number}[] = []; 
    for (let obj of data.questions) { 
     //comparing how i do this: set a "temp" variable to use: 
     let answerNum: number = 1; 
     //this is only checking for "falsey" not undefined or null -- that is unimportant for the sake of this question 
     if (obj.answer) { 
     answerNum = obj.answer; 
     } 
     //vs. way #2: just checking if the var exists and setting it 
     if (angular.isUndefined(obj.active)) { 
     obj.active = true; 
     } 
     //now push to the temp JSON structure: 
     if (data.completed && obj.answer) { 
     questionableJSON.push({ 
      id: obj.id, 
      question: obj.question, 
      answer: answerNum 
     }); 
     } 
     else if (!data.completed && obj.active) { 
     questionableJSON.push({ 
      id: obj.id, 
      question: obj.question, 
      answer: answerNum 
     }); 
     } 
    } 
    }); 
    //now set our controller question data to our newly obtained data populated in our temp JSON from the response: 
    vm.questions = questionableJSON; 

質問がある:それは私が設定obj.active同じ方法のために一時変数を設定することをお勧めしますanswerNumの一時変数?または、ループの各繰り返しに対して別の一時変数を宣言するのではなく、obj.activeを値に設定する方がよいでしょうか?これらの慣行のうち、よりクリーンで効率的なものはどれですか?これは通常のjavascriptにも当てはまり、この関数は通常のJSとほとんど変わりません。これは、Angularに特定のものではありません。

これで十分でない場合、if.. else ifを1つのif文に||以下のような:

if (data.completed && obj.answer || !data.completed && obj.active) 

おかげで

+1

この疑問を書いたCPUサイクルは、すでにobj.activeをtemp varに割り当てるのではなく、毎回逆参照するのではなく、もっと多くのCPUサイクルを浪費していると思います。読みやすさまず!コードの維持**は**高価です。 –

答えて

0

typescriptですとangular2では、通常letでそれを書き、その答えは値ですが、LETとVARの違いだけscope of them

+0

それは理にかなっていますが、質問には答えません –

0

あなたにあります多くの視点から解釈することができます。私は、あなたの質問を「最も効果的なのは何ですか?」と解釈します。

this questionを参照すると、letスコープの変数はループボディレベルでスコープされているようです。つまり、ループボディ内で宣言された変数は、各ループボディの実行直後にガベージコレクションの対象になります。この観点からは、アンケートAPIから返されたデータセットが何十万もの結果が長くない限り、実際には違いはありません。ループ本体のスコープ内にのみ存在する1つのブール変数を作成することによるパフォーマンスの低下は、api呼び出し自体が解決するのに要する時間に比べて重要ではありません。

しかし、コメントに記載されたBrunoのように、それは単にそれについて明示的にするだけではなく、読みやすく保守的かもしれません。あなたの質問は読みやすさに関するものではありませんでしたが、IMHOにはコードの読みやすさが含まれていました。

関連する問題