2017-01-12 1 views
2

리팩토링 :Lodash 코드 최적화 /이 원래 JSON 데이터입니다

var data= [ 
     { project: "ABC", area: 'Test',  subArea: 'Dev',  done: 10 }, 
     { project: "ABC", area: 'Test',  subArea: 'QA',  done: 10 }, 
     { project: "ABC", area: 'Test',  subArea: 'Support', done: 10 }, 
     { project: "ABC", area: 'External', subArea: 'Dev',  done: 5 }, 
     { project: "ABC", area: 'External', subArea: 'QA',  done: 5 }, 
     { project: "ABC", area: 'External', subArea: 'Support', done: 5 }, 
     { project: "ABC", area: 'Escalation', subArea: 'Dev',  done: 20 }, 
     { project: "ABC", area: 'Escalation', subArea: 'QA',  done: 20 }, 
     { project: "ABC", area: 'Escalation', subArea: 'Support', done: 20 }, 
     { project: "ABC123", area: 'Test',  subArea: 'Dev',  done: 20 }, 
     { project: "ABC123", area: 'Test',  subArea: 'QA',  done: 20 }, 
     { project: "ABC123", area: 'Test',  subArea: 'Support', done: 20 }, 
     { project: "ABC123", area: 'External', subArea: 'Dev',  done: 10 }, 
     { project: "ABC123", area: 'External', subArea: 'QA',  done: 10 }, 
     { project: "ABC123", area: 'External', subArea: 'Support', done: 10 }, 
     { project: "ABC123", area: 'Escalation', subArea: 'Dev',  done: 5 }, 
     { project: "ABC123", area: 'Escalation', subArea: 'QA',  done: 5 }, 
     { project: "ABC123", area: 'Escalation', subArea: 'Support', done: 5 }, 
    ]; 

내가 필요로하는 지역에서 그들을 분할하고 각 수행시간을 요약, 프로젝트으로 항목을 그룹화하는 것입니다 하위 영역. 내 실제 코드 울부 짖는 소리와

[ 
    { 
     "name": "ABC", 
     "test": { 
     "total": 30, 
     "totalDev": 10, 
     "totalQA": 10, 
     "totalSup": 10 
     }, 
     "external": { 
     "total": 15, 
     "totalDev": 5, 
     "totalQA": 5, 
     "totalSup": 5 
     }, 
     "escalation": { 
     "total": 60, 
     "totalDev": 20, 
     "totalQA": 20, 
     "totalSup": 20 
     } 
    }, 
    { 
     "name": "ABC123", 
     "test": { 
     "total": 60, 
     "totalDev": 20, 
     "totalQA": 20, 
     "totalSup": 20 
     }, 
     "external": { 
     "total": 30, 
     "totalDev": 10, 
     "totalQA": 10, 
     "totalSup": 10 
     }, 
     "escalation": { 
     "total": 15, 
     "totalDev": 5, 
     "totalQA": 5, 
     "totalSup": 5 
     } 
    } 
] 

나는 이미 내가 원하는 결과를 받고 있어요,하지만 난 코드를 더 최적화 할 수 있다고 생각 : 새로운 JSON 결과는 다음과 같이해야합니다. 반복없이, 모든 조건부 검증은 하드 코드없이 영역 및 하위 영역 특성을 맵 블록 내에 포함합니다. 이러한 값은 서버 측 영역에서 동적이기 때문입니다.

var sum = (total, item) => total += item.done; 

result = _.chain(data) 
      .groupBy(function(value) { return value.project }) 
      .map((projectGroup, projectName) => ({ 
        name: projectName, 
        test: { 
         total: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Test')) , sum, 0), 
         totalDev: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Test' && o.subArea === 'Dev')) , sum, 0), 
         totalQA: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Test' && o.subArea === 'QA')) , sum, 0), 
         totalSup: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Test' && o.subArea === 'Support')) , sum, 0) 
        }, 
       external: { 
         total: _.reduce(_.filter(projectGroup, (o) => (o.area === 'External')) , sum, 0), 
         totalDev: _.reduce(_.filter(projectGroup, (o) => (o.area === 'External' && o.subArea === 'Dev')) , sum, 0), 
         totalQA: _.reduce(_.filter(projectGroup, (o) => (o.area === 'External' && o.subArea === 'QA')) , sum, 0), 
         totalSup: _.reduce(_.filter(projectGroup, (o) => (o.area === 'External' && o.subArea === 'Support')) , sum, 0) 
        }, 
        escalation: { 
         total: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Escalation')) , sum, 0), 
         totalDev: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Escalation' && o.subArea === 'Dev')) , sum, 0), 
         totalQA: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Escalation' && o.subArea === 'QA')) , sum, 0), 
         totalSup: _.reduce(_.filter(projectGroup, (o) => (o.area === 'Escalation' && o.subArea === 'Support')) , sum, 0) 
        }  
    })) 
+0

'.groupBy (기능 (값) {반환 value.project})'단순히'.groupBy ('프로젝트')가 될 수' –

+0

이유 ABC 테스트 totaldev = 30? 그 번호는 어디에서 왔는가? –

+1

이제 수정했습니다. – sandrojack

답변

0

여기서 최적화하고 싶은 아이디어가 없다면 대신 lodash가 대신해야합니다. 나는 단지 하나의 발언

var sum = (total, item) => total += item.done; 
function reduceData(projectGroup, projectName, comparationLabel) { 
    return { 
    total: _.reduce(_.filter(projectGroup, (o) => (o.area === comparationLabel)) , sum, 0), 
    totalDev: _.reduce(_.filter(projectGroup, (o) => (o.area === comparationLabel && o.subArea === 'Dev')) , sum, 0), 
    totalQA: _.reduce(_.filter(projectGroup, (o) => (o.area === comparationLabel && o.subArea === 'QA')) , sum, 0), 
    totalSup: _.reduce(_.filter(projectGroup, (o) => (o.area === comparationLabel && o.subArea === 'Support')) , sum, 0) 
    } 
} 
result = _.chain(data) 
      .groupBy(function(value) { return value.project }) 
      .map((projectGroup, projectName) => ({ 
        name: projectName, 
        test: reduceData(projectGroup, projectName, 'Test'), 
        external: reduceData(projectGroup, projectName, 'External'), 
        escalation: reduceData(projectGroup, projectName, 'Escalation')  
    })) 

을 그리고 네, 당신은 캐시의 어떤 종류의 일을한다면 당신은 _.filter(projectGroup, (o)의 피할 수 있지만, 프로그램 자원의 작은 수를 저장합니다.

+0

감사합니다. 그게 내가 찾고 있던거야! – sandrojack

0

오히려 다음과 같이 중첩 이상 :

당신은 두 번 컬렉션을 통해 반복 방지하기 위해이 작업을 수행 할 수 있습니다
_.reduce(_.filter(projectGroup, ...), sum, 0) 

:

_(projectGroup).filter(...).reduce(sum, 0).value() 
+0

감사! 나는 변화를 만들 것이다. – sandrojack

0

왜 일반 자바 스크립트에서 하나의 루프를 사용하지 그룹화 및 합산을 위해 시간?

이 제안은 해시 테이블을 사용하고 project 속성 값으로 그룹화합니다.

var data = [{ project: "ABC", area: 'Test', subArea: 'Dev', done: 10 }, { project: "ABC", area: 'Test', subArea: 'QA', done: 10 }, { project: "ABC", area: 'Test', subArea: 'Support', done: 10 }, { project: "ABC", area: 'External', subArea: 'Dev', done: 5 }, { project: "ABC", area: 'External', subArea: 'QA', done: 5 }, { project: "ABC", area: 'External', subArea: 'Support', done: 5 }, { project: "ABC", area: 'Escalation', subArea: 'Dev', done: 20 }, { project: "ABC", area: 'Escalation', subArea: 'QA', done: 20 }, { project: "ABC", area: 'Escalation', subArea: 'Support', done: 20 }, { project: "ABC123", area: 'Test', subArea: 'Dev', done: 20 }, { project: "ABC123", area: 'Test', subArea: 'QA', done: 20 }, { project: "ABC123", area: 'Test', subArea: 'Support', done: 20 }, { project: "ABC123", area: 'External', subArea: 'Dev', done: 10 }, { project: "ABC123", area: 'External', subArea: 'QA', done: 10 }, { project: "ABC123", area: 'External', subArea: 'Support', done: 10 }, { project: "ABC123", area: 'Escalation', subArea: 'Dev', done: 5 }, { project: "ABC123", area: 'Escalation', subArea: 'QA', done: 5 }, { project: "ABC123", area: 'Escalation', subArea: 'Support', done: 5 }], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    var area = a.area.toLowerCase(), 
 
     subArea = 'total' + a.subArea; 
 

 
    if (!this[a.project]) { 
 
     this[a.project] = { name: a.project }; 
 
     result.push(this[a.project]); 
 
    } 
 
    this[a.project][area] = this[a.project][area] || { total: 0 }; 
 
    this[a.project][area][subArea] = (this[a.project][area][subArea] || 0) + a.done; 
 
    this[a.project][area].total += a.done; 
 
}, Object.create(null)); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

고마워요! 귀하의 코드는 정말 훌륭하고 내 문제를 해결했지만 지금은 Lodash를 사용하는 것이 더 편합니다. – sandrojack