2017-01-19 2 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; 
} 

모든 개체는 0 길이가 같고 날짜 순서가 동일해야합니다. 내 일반적인 전략은 중첩 된지도를 수행하여 배열 만 판매 배열로 가져 오는 것입니다. 그런 다음 배열을 압축하여 월별 판매를 그룹화합니다. 그런 다음 마침내 각 달을 줄여서 매월 총 판매를 찾은 다음 최대 월을 찾습니다.

제 질문은 어떻게 이상적인 로다시 체인으로이 기능을 다시 쓸 수 있습니까? 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

아름다운, 감사합니다. –

관련 문제