2017-01-19 11 views
0

売り上げが最も高い月の売上値を見つけたオブジェクトの配列に対して一連の操作(最初はアンダースコアを使用)を実行します。コードをエレガントなLodashに変換する方法

データ:valuesアレイは、特定の月の合計売上を表します。 x =日付、y =売上。

[ 
    { 
     name:'banana', 
     values:[ 
      { 
       x: //date object: jan 2016, 
       y: 3423 
      }, 
      { 
       x: //date object: feb 2016, 
       y: 53453 
      }, 
      { 
       x: //date object: mar 2016, 
       y: 65457 
      }, 
      { 
       x: //date object: apr 2016, 
       y: 456345 
      }, 
      ...//12 months 
     ] 
    }, 
    { 
     name:'apple', 
     values:[ 
      { 
       x: //date object: jan 2016, 
       y: 34876 
      }, 
      { 
       x: //date object: feb 2016, 
       y: 89 
      }, 
      { 
       x: //date object: mar 2016, 
       y: 7896 
      }, 
      { 
       x: //date object: apr 2016, 
       y: 6547 
      }, 
      ...//12 months 
     ] 
    }, 
    ... more objects 
] 

マイ機能:すべての月の中で最も高い売上額を返します。

getMaxMonthlySales:function(data){ 
    var salesArrays = _.map(data,obj=>_.map(obj.values,'y')) 

    var maxSales = _.zip.apply(null,salesArrays) 
    maxSales = _.reduce(maxSales,(max,arr)=>{ 
     var sum = _.reduce(arr,(memo,val)=>memo+val); 
     return Math.max(max,sum); 
    },0) 

    return maxSales; 
} 

valuesすべてのオブジェクトの配列は、同じ長さで、同じ日付の順序を持​​つことが保証されています。私の一般的な戦略は、販売のみの配列の配列を取得するためにネストされたマップを実行することです。次に、月ごとに売上をグループ化するために配列を圧縮します。最後に各月を減らして1か月あたりの総売上高を求め、最大月を見つけます。

私の質問は、理想的にはロダッシュチェーンとしてこの機能を書き換えることができますか? onelinerとして

答えて

1

getMaxMonthlySales: function(data) { 
    return _.max(_.map(_.groupBy(_.flatten(_.map(data, 'values')), 'x'), 
        o => _.sumBy(o, 'y'))); 
} 

それとも

getMaxMonthlySales: function(data) { 
    return _(data) 
     .map('values') 
     .flatten() 
     .groupBy('x') 
     .map(o => _.sumBy(o, 'y')) 
     .max(); 
} 
+0

美しい、ありがとう。 –

関連する問題