2016-12-13 10 views
0

결과와 객체를 반환그래서 성공적으로 난 후예요 결과를 얻을 관리했습니다 만든 특정 계산에 .reduce 기능을 사용하고 배열

{ 
    "stats": [ 
    { 
     "name": "Soft Drinks", 
     "sold": 68 
    }, 
    { 
     "name": "Snacks", 
     "sold": 6 
    }, 
    { 
     "name": "Coffee and warm drinks", 
     "sold": 52 
    } 
    ] 
} 

다른 날 배열을 처리 할 때 정확히 동일한 객체 구조가 사용됩니다. pastDay에 정의되지 않은 오류가 발생했습니다. 누구든지 문제를 파악하는 데 도움이 될 수 있습니까? 또는 내가 .reduce

배열 내가 함께하는 데 문제에 대안을 찾을 수 있도록 도와 :

const days = [ 
 
    { 
 
     "_id":{ 
 
     "_str":"f23f02994ab992437e423e24" 
 
     }, 
 
     "date":"2016-12-13T00:00:00.000Z", 
 
     "statistics":{ 
 
     "breakdown":{ 
 
      "byTurnover":[ 
 
       { 
 
        "name":"Soft Drinks", 
 
        "sold":34, 
 
        "percentage":31.14 
 
       }, 
 
       { 
 
        "name":"Snacks", 
 
        "sold":3, 
 
        "percentage":2.65 
 
       }, 
 
       { 
 
        "name":"Coffee and warm drinks", 
 
        "sold":26, 
 
        "percentage":21.54 
 
       }, 
 
       { 
 
        "name":"Brandy", 
 
        "sold":2, 
 
        "percentage":2.75 
 
       }, 
 
       { 
 
        "name":"Beer", 
 
        "sold":20, 
 
        "percentage":20.15 
 
       }, 
 
       { 
 
        "name":"Mixed drinks Other", 
 
        "sold":21, 
 
        "percentage":21.77 
 
       } 
 
      ], 
 
     } 
 
     }, 
 
     "id":{ 
 
     "_str":"f23f02994ab992437e423e24" 
 
     } 
 
    }, 
 
    { 
 
     "_id":{ 
 
     "_str":"b3d0ad7f314e33021739f70c" 
 
     }, 
 
     "date":"2016-12-14T00:00:00.000Z", 
 
     "statistics":{ 
 
     "breakdown":{ 
 
      "byTurnover":[ 
 
       { 
 
        "name":"Soft Drinks", 
 
        "sold":34, 
 
        "percentage":31.14 
 
       }, 
 
       { 
 
        "name":"Snacks", 
 
        "sold":3, 
 
        "percentage":2.65 
 
       }, 
 
       { 
 
        "name":"Coffee and warm drinks", 
 
        "sold":26, 
 
        "percentage":21.54 
 
       }, 
 
       { 
 
        "name":"Brandy", 
 
        "sold":2, 
 
        "percentage":2.75 
 
       }, 
 
       { 
 
        "name":"Beer", 
 
        "sold":20, 
 
        "percentage":20.15 
 
       }, 
 
       { 
 
        "name":"Mixed drinks Other", 
 
        "sold":21, 
 
        "percentage":21.77 
 
       } 
 
      ], 
 
     } 
 
     }, 
 
     "id":{ 
 
     "_str":"b3d0ad7f314e33021739f70c" 
 
     } 
 
    }, 
 
    { 
 
     "_id":{ 
 
     "_str":"e1906ce07ab811c74528e3cc" 
 
     }, 
 
     "date":"2016-12-15T00:00:00.000Z", 
 
     "statistics":{ 
 
     "breakdown":{ 
 
      "byTurnover":[ 
 
       { 
 
        "name":"Soft Drinks", 
 
        "sold":34, 
 
        "percentage":31.14 
 
       }, 
 
       { 
 
        "name":"Snacks", 
 
        "sold":3, 
 
        "percentage":2.65 
 
       }, 
 
       { 
 
        "name":"Coffee and warm drinks", 
 
        "sold":26, 
 
        "percentage":21.54 
 
       }, 
 
       { 
 
        "name":"Brandy", 
 
        "sold":2, 
 
        "percentage":2.75 
 
       }, 
 
       { 
 
        "name":"Beer", 
 
        "sold":20, 
 
        "percentage":20.15 
 
       }, 
 
       { 
 
        "name":"Mixed drinks Other", 
 
        "sold":21, 
 
        "percentage":21.77 
 
       } 
 
      ], 
 
     } 
 
     }, 
 
     "id":{ 
 
     "_str":"e1906ce07ab811c74528e3cc" 
 
     } 
 
    }, 
 
]; 
 

 
const newStats = days.reduce(function (pastDay, currentDay) { 
 
    const nextStats = currentDay.statistics.breakdown.byTurnover.map(function(stat) { 
 
    \t const oldSold = pastDay.statistics.breakdown.byTurnover.find(function (old) { 
 
    \t return old.name === stat.name; 
 
    }); 
 
    
 
    \t const newSold = stat.sold + oldSold.sold; 
 
    \t stat.sold = newSold; 
 
    return stat; 
 
    }); 
 

 
    return { 
 
    stats: nextStats, 
 
    }; 
 
}); 
 

 
console.log(newStats);

출력 : Uncaught TypeError: Cannot read property 'breakdown' of undefined

두 번째 배열의 .reduce 코드 :

const newStats = days.reduce(function (pastDay, currentDay) { 
    const nextStats = currentDay.statistics.breakdown.byTurnover.map(function(stat) { 
    const oldSold = pastDay.statistics.breakdown.byTurnover.find(function (old) { 
     return old.name === stat.name; 
    }); 

    const newSold = stat.sold + oldSold.sold; 
    stat.sold = newSold; 
    return stat; 
    }); 

    return { 
    stats: nextStats, 
    }; 
}); 

console.log(newStats); 

답변

1

귀하의 감속기는

return { 
    stats: nextStats, 
}; 

같이 입력 배열을 일치하는 개체 형식을 반환 그리고 당신의 배열과 같이 보인다 : 그래서

const days = [{ stats: [...] }] 

때와 같은 .stats 이상 당신의 내부 루프 반복 배열을 실행하면 올바르게 실행됩니다.

귀하의 감속기는이 구조와 객체 반복된다

const days = [{ statistics: { breakdown: { byTurnover: [...] } }] 

그러나 물체가 그 구조가 일치하지 않는 반환

return { 
    stats: nextStats, 
}; 

그래서 감속기의 첫 번째 반복 것을 두 번째 반복이 실행되고 첫 번째 인수 인 pastDay은 이전 실행의 반환 값이 될 것이고, 찾고있는 키가 없습니다.

신속하고 더러운 솔루션을 반환 할 때 단지 객체 키 깊이와 일치하는 것입니다

const newStats = days.reduce(function (pastDay, currentDay) { 
    const nextStats = currentDay.statistics.breakdown.byTurnover.map(function(stat) { 
     const oldSold = pastDay.statistics.breakdown.byTurnover.find(function (old) { 
      return old.name === stat.name; 
     }); 

     const newSold = stat.sold + oldSold.sold; 
     stat.sold = newSold; 
     return stat; 
    }); 

    return { 
     statistics: { breakdown: { byTurnover: nextStats } }, 
    }; 
}); 

을 질문에 답변이 있지만, 사용하고있는 논리는 따라 가기 어렵다. 코드에서 불분명 한 성취하려는 내용에 따라 이것이 이상적인 방법이 아닐 수도 있습니다.

+0

앤디 감사합니다. 이 방법이 효과가 있지만 다른 접근 방법을 권하고 있습니까? –

+0

어쩌면 코드에 따라 달라 지겠습니까? –

+0

중첩 된 결과 대신에 const days = [{stats : [...]}] 처럼 결과를 반환 할 수있는 방법이 있습니까? –