2014-02-07 2 views
0

각각 날짜와 값이 포함 된 2 개의 개체가있는 인덱스 배열이 있다고 가정 해 보겠습니다. "other" 키를 포함하는 개체와 "baseline" 인 개체의 값의 분산을 계산하는 가장 좋은 방법은 무엇입니까?날짜가 일치하는 javascript 인덱스 배열 분산 계산

때로는 날짜가 정렬되어 있지만 항상 그런 것은 아닙니다. 또한 날짜가 유효한 구문 분석 날짜라고 가정합니다.

인덱싱 된 배열은 그래프 작성을 위해 CSV에서 d3.nest().key().entries()에 의해 생성됩니다. CSV로 미리 계산할 수는 있지만 많은 물체가 있고 기준선이 즉시 변경 될 수 있습니다.

array = [ 
    { 
     key: "baseline", 
     values: [ 
      { 
       date: "Jan 1 2013", // assume valid parsed date 
       value: 100 
      }, 
      { 
       date: "Jan 2 2013", 
       value: 150 
      } 
     ] 
    }, 
    { 
     key: "other", 
     values: [ 
      { 
       date: "Jan 2 2013", // note dates do not line up 
       value: 1000 
      }, 
      { 
       date: "Jan 3 2013", 
       value: 2000 
      } 
     ] 
    }, 
] 

원하는 결과 : 내가 제대로 이해하면

desiredResult = [ 
    { 
     key: "baseline", 
     values: [ 
      { 
       date: "Jan 1 2013", // assume valid parsed date 
       value: 100, 
       delta: 0 // 0 because it's the baseline 
      }, 
      { 
       date: "Jan 2 2013", 
       value: 150, 
       delta: 0 
      } 
     ] 
    }, 
    { 
     key: "other", 
     values: [ 
      { 
       date: "Jan 2 2013", 
       value: 1000, 
       delta: 6.666666666666667 // 1000/150 
      }, 
      { 
       date: "Jan 3 2013", // note dates do not line up 
       value: 2000, 
       delta: null // null because there's no date match 
      } 
     ] 
    }, 
] 

답변

1

, 다음을 수행해야합니다

PS를 : 나는 잰 2 2013의 기준을 가지고 있기 때문에 귀하의 예를 잘못이라고 생각 150, not 0 100.

function applyDeltas(arr, baseline) { 
    //find baseline values 
    arr.some(function (item) { 
     return item.key === baseline && (baseline = item.values); 
    }); 

    //build a date index for quick lookups 
    baseline = baseline.reduce(function (res, item) { 
     res[item.date] = item.value; 
     return res; 
    }, {}); 

    arr.forEach(function (item) { 
     item.values.forEach(function (valItem) { 
      var bl = baseline[valItem.date], 
       val = valItem.value; 

      valItem.delta = typeof bl !== 'undefined'? (bl === val? 0 : val/bl) : null; 
     }); 
    }); 
} 

applyDeltas(array, 'baseline'); 
+0

감사합니다.이 기능은 매우 잘 작동하며 고차원 함수는 간결하게 유지합니다. 편집 한 예에서 실수가있었습니다. –