2017-01-15 30 views
2

次の配列が与えられました:mainGroupごとにすべてをtimestampでグループ化し、realを合計します。結果の下に私が後だ見る...オブジェクトの配列は、条件が満たされたときに新しい構造に変更されます

var arr = [ 
    { 
    mainGroup: 'A', 
    subGroup: 'B', 
    real: 100, 
    timestamp: '2017-01-15T01:00:00.000Z' 
    }, 
    { 
    mainGroup: 'A', 
    subGroup: 'C', 
    real: 150, 
    timestamp: '2017-01-15T01:00:00.000Z' 
    }, 
    { 
    mainGroup: 'B', 
    subGroup: 'D', 
    real: 123, 
    timestamp: '2017-01-15T01:00:00.000Z' 
    }, 
    { 
    mainGroup: 'B', 
    subGroup: 'Y', 
    real: 542, 
    timestamp: '2017-01-15T01:00:00.000Z' 
    } 
] 

結果は次のようになります。

[ 
    { 
    A: 250, // 250 is sub B real + sub C real. 
    B: 665, // 665 is sub D real + sub Y real. 
    timestamp: '2017-01-15T01:00:00.000Z' 
    }, 
] 

私のコード今のところ:

var arr = [ 
 
    { 
 
    mainGroup: 'A', 
 
    subGroup: 'B', 
 
    real: 100, 
 
    timestamp: '2017-01-15T01:00:00.000Z' 
 
    }, 
 
    { 
 
    mainGroup: 'A', 
 
    subGroup: 'C', 
 
    real: 150, 
 
    timestamp: '2017-01-15T01:00:00.000Z' 
 
    }, 
 
    { 
 
    mainGroup: 'B', 
 
    subGroup: 'D', 
 
    real: 123, 
 
    timestamp: '2017-01-15T01:00:00.000Z' 
 
    }, 
 
    { 
 
    mainGroup: 'B', 
 
    subGroup: 'Y', 
 
    real: 542, 
 
    timestamp: '2017-01-15T01:00:00.000Z' 
 
    } 
 
] 
 

 
let b = arr.reduce((a, item) => { 
 
    a[item.timestamp] = a[item.timestamp] || {}; 
 

 
    Object.assign(a[item.timestamp], { 
 
    [item.mainGroup]: item.real 
 
    }); 
 

 
    return a; 
 
}, {}); 
 

 
Object.keys(b) 
 
    .map(timestamp => Object.assign(b[timestamp], { timestamp })); 
 

 
console.log(b)

答えて

1

あなたがグループを参照するためのオブジェクトを使用することができます。 Array#forEach

var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }], 
 
    grouped = []; 
 

 
array.forEach(function (a) { 
 
    if (!this[a.timestamp]) { 
 
     this[a.timestamp] = { timestamp: a.timestamp }; 
 
     grouped.push(this[a.timestamp]); 
 
    } 
 
    this[a.timestamp][a.mainGroup] = (this[a.timestamp][a.mainGroup] || 0) + a.real; 
 
}, Object.create(null)); 
 

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

Array#reduce

var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }], 
 
    grouped = array.reduce(function (hash) { 
 
     return function (r, a) { 
 
      if (!hash[a.timestamp]) { 
 
       hash[a.timestamp] = { timestamp: a.timestamp }; 
 
       r.push(hash[a.timestamp]); 
 
      } 
 
      hash[a.timestamp][a.mainGroup] = (hash[a.timestamp][a.mainGroup] || 0) + a.real; 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

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

ES6で

Array#reduce

var array = [{ mainGroup: 'A', subGroup: 'B', real: 100, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'A', subGroup: 'C', real: 150, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'D', real: 123, timestamp: '2017-01-15T01:00:00.000Z' }, { mainGroup: 'B', subGroup: 'Y', real: 542, timestamp: '2017-01-15T01:00:00.000Z' }], 
 
    grouped = array.reduce((hash => (r, a) => { 
 
     if (!hash[a.timestamp]) { 
 
      hash[a.timestamp] = { timestamp: a.timestamp }; 
 
      r.push(hash[a.timestamp]); 
 
     } 
 
     hash[a.timestamp][a.mainGroup] = (hash[a.timestamp][a.mainGroup] || 0) + a.real; 
 
     return r; 
 
    })(Object.create(null)), []); 
 

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

+0

ありがとうございます。あなたは反抗的にアルゴリズムのマスターです:D –

+0

結果の値(配列)は反復ごとに変化しません。常に同じ配列なので、reduceは必要ありませんが、本当にreduceを使いたい場合は、よく –

+0

ええ、私は2つを比較したいです!もう一度ありがとう –

1

A)アキュムレータの初期値を正しく初期化する

b)の合計A、Bの値 - あなたは値(上書き)

arr.reduce(function(acc, next){ 
    if (next.timestamp) { 
     acc.timestamp = next.timestamp; 
    } 

    if (acc[next.mainGroup] === undefined) { 
     acc[next.mainGroup] = 0; 
    } 

    acc[next.mainGroup] += next.real; 

    return acc; 
}, {}) 

や、コードの還元された形で再割り当てされています

arr.reduce(function(acc, next){ 
    acc.timestamp = next.timestamp || acc.timestamp; 

    acc[next.mainGroup] = (acc[next.mainGroup] || 0) + next.real; 

    return acc; 
}, {}) 
+0

おかげで、キーが不明なものかどうか? A、B –

+0

ダイナミックキーのアップデートを参照してください。 –

+0

ニナの回答とは異なり、結果はタイムスタンプでグループ化されていません。 –

関連する問題