2016-12-07 6 views
2

私はES6とReactで作業しています。私は、Java Restサービスからの応答オブジェクトを解析しています。オブジェクトを2つのオブジェクトに解析するためのより洗練された方法があると私にはわかりました。このwokrs、ちょうどclunkyに見えます。リストを整理するためのよりクリーンな方法はありますか?

  let draftList = []; 
      let readyForApprovalList = []; 
      for (let i = 0; i < action.allStatusesSurveysList.length; i++){ 
       if (action.allStatusesSurveysList[i].status === statusTypes.DRAFT){ 
        draftList.push(action.allStatusesSurveysList[i]); 
       } else if (action.allStatusesSurveysList[i].status === statusTypes.READY_FOR_APPROVAL){ 
        readyForApprovalList.push(action.allStatusesSurveysList[i]); 
       } 
      } 
+0

よりも優れています。 –

答えて

2

Array.prototype.filter()arrow filter functionsの組み合わせはかなりきれいな解決策になります。

このソリューションは素晴らしく読みやすいものですが、配列の少なくとも2回の反復が必要なので、最も効率的ではありません。しかし、大部分のユースケースでは十分に効率的であり、この理由からトレードオフが良いかもしれません。

const draftList = action.allStatusesSurveysList 
    .filter(i => i.status === statusTypes.DRAFT) 
const readyForApprovalList = action.allStatusesSurveysList 
    .filter(i => i.status === statusTypes.READY_FOR_APPROVAL) 

あなたも、さらにステータスフィルタ機能を抽出できます。

const byStatus = status => item => item.status === status 

const draftList = action.allStatusesSurveysList 
    .filter(byStatus(statusTypes.DRAFT)) 
const readyForApprovalList = action.allStatusesSurveysList 
    .filter(byStatus(statusTypes.READY_FOR_APPROVAL)) 
1

forEachは、おそらくここに良く機能するであろう - あなたはfilterを使用することができますが、それは各カテゴリのタイプごとに1つのパスが必要になります。

action.allStatusesSurveysList.forEach(function(item) { 
    switch(item.status) { 
     case statusTypes.DRAFT: 
      draftList.push(item); 
      break; 
     case statusTypes.READY_FOR_APPROVAL: 
      readyForApprovalList.push(item); 
      break; 
     default: 
      // "unknown status" list?? 
    } 
}); 

これは、配列を反復してitemを使用しての代わりに、繰り返しaction.allStatusesSurveysList[i]を置くのきちんとした余分を持っています。また、switchステートメントを使用すると、map()および/または `filter()`よりもif..else if..

+0

ループを分割し、2つの 'filter'を実行することは、' forEach'と 'switch-case'よりも最適化されたアプローチであると思います。とにかく 'switch-case'は内部的に' if-else'に変換されます。 – Quirk

+0

@Quirkおそらく、 'filter'アプローチは同じ配列に対して何度も繰り返し実行され、1回の反復だけが必要なときは気になりません。私はまた、将来のステータスが必要な場合、私の 'switch'メソッドがより拡張可能であると感じています。 –

+0

2つ以上のケースが関わっている場合は同意しますが、それは理にかなって読みやすくなります。そうでなければ、私はいつもこれについて考えています:http://stackoverflow.com/a/11227902/2844164 – Quirk

関連する問題