2017-02-21 18 views
2

私は合計計算に必要な基本的に3つの重要なパラメータを持つオブジェクトを持っています。 だから例えば私のオブジェクトは以下の通りです:配列に基づいてオブジェクトから集計値を計算し、合計で同じに更新する

[ 
{'Id':1,'ResourceId':1,'StartDate':'01-01-2017','Hours':8,'TotalHrs':8}, 
{'Id':2,'ResourceId':1,'StartDate':'01-01-2017','Hours':4,'TotalHrs':4}, 
{'Id':3,'ResourceId':1,'StartDate':'01-03-2017','Hours':4,'TotalHrs':4}, 
{'Id':4,'ResourceId':1,'StartDate':'01-03-2017','Hours':4,'TotalHrs':4}, 
{'Id':5,'ResourceId':2,'StartDate':'01-01-2017','Hours':2,'TotalHrs':2}, 
{'Id':6,'ResourceId':2,'StartDate':'01-01-2017','Hours':4,'TotalHrs':4}, 
{'Id':7,'ResourceId':2,'StartDate':'01-03-2017','Hours':2,'TotalHrs':2}, 
] 

ので、現在TotalHrsパラメータは、時間パラメータの値と同じです。

私はそれが特定のResourceIdとStartdateの合計であることを望みます。 すなわち、配列内にResourceIdとStartdateが一致する場合、TotalHrsパラメータはHoursパラメータの値の合計である必要があります。

最終的な配列になります。したがって、上記の例では

[ 
{'Id':1,'ResourceId':1,'StartDate':'01-01-2017','Hours':8,'TotalHrs':12}, 
{'Id':2,'ResourceId':1,'StartDate':'01-01-2017','Hours':4,'TotalHrs':12}, 
{'Id':3,'ResourceId':1,'StartDate':'01-03-2017','Hours':4,'TotalHrs':8}, 
{'Id':4,'ResourceId':1,'StartDate':'01-03-2017','Hours':4,'TotalHrs':8}, 
{'Id':5,'ResourceId':2,'StartDate':'01-01-2017','Hours':2,'TotalHrs':6}, 
{'Id':6,'ResourceId':2,'StartDate':'01-01-2017','Hours':4,'TotalHrs':6}, 
{'Id':7,'ResourceId':2,'StartDate':'01-03-2017','Hours':2,'TotalHrs':2}, 
] 

ResourceId:1とStartDate:2017年1月1日に8,4時間程度の値を持つ2つのオカレンスがあるので、そこTotalHrsは8 + 4 = 12となります。

また、私は結果の配列ではなくTotalHrsのための更新された値と同じ数の要素をしたい、して、グループにしたくありません。 Array.prototype.reduce()Array.prototype.forEach()機能使用

+0

値01-01-2017'' [オブジェクトのjavascript配列にGROUPBYするための最も効率的な方法は何ですか?]の – RomanPerekhrest

+0

可能な重複は無効です(http://stackoverflow.com/questions/14446511/what-is-the-most-efficient-method-to-groupby-on-a-javascript-array-of-objects) – George

+0

@RomanPerekhrest、日付形式ではない正確には、そのString.Iは、アプリケーションのためにこの方法を使用する必要があります。 – Mukta

答えて

0

ショートソリューション:

var data = [ {'Id':1,'ResourceId':1,'StartDate':'01-01-2017','Hours':8,'TotalHrs':8}, {'Id':2,'ResourceId':1,'StartDate':'01-01-2017','Hours':4,'TotalHrs':4}, {'Id':3,'ResourceId':1,'StartDate':'01-03-2017','Hours':4,'TotalHrs':4}, {'Id':4,'ResourceId':1,'StartDate':'01-03-2017','Hours':4,'TotalHrs':4}, {'Id':5,'ResourceId':2,'StartDate':'01-01-2017','Hours':2,'TotalHrs':2}, {'Id':6,'ResourceId':2,'StartDate':'01-01-2017','Hours':4,'TotalHrs':4}, {'Id':7,'ResourceId':2,'StartDate':'01-03-2017','Hours':2,'TotalHrs':2} ]; 
 

 
data.forEach(function (o) { 
 
    o.TotalHrs = this[o.ResourceId + o.StartDate]; 
 
}, data.reduce(function (r, o) { 
 
    var k = o.ResourceId + o.StartDate; 
 
    (!r[k])? r[k] = o.TotalHrs : r[k] += o.TotalHrs; 
 
    return r; 
 
}, {})); 
 

 
console.log(data);

var k = o.ResourceId + o.StartDate; - kは、ここで私は、同じResourceIdStartDate属性

0

でエントリをグループ化するハッシュキー文字列です時間を使うことを提案するaryオブジェクトで、StartDateResourceIdをハッシュキーとして使用して、時間を格納します。このアルゴリズムはO(n)時間の複雑さをもたらす。

var data = [{'Id':1,'ResourceId':1,'StartDate':'01-01-2017','Hours':8},{'Id':2,'ResourceId':1,'StartDate':'01-01-2017','Hours':4},{'Id':3,'ResourceId':1,'StartDate':'01-03-2017','Hours':4},{'Id':4,'ResourceId':1,'StartDate':'01-03-2017','Hours':4},{'Id':5,'ResourceId':2,'StartDate':'01-01-2017','Hours':2},{'Id':6,'ResourceId':2,'StartDate':'01-01-2017','Hours':4},{'Id':7,'ResourceId':2,'StartDate':'01-03-2017','Hours':2}]; 
 

 
function populateTotalHrs(collection) { 
 
    var collectionByHash = {}; 
 
    collection.forEach(function(obj) { 
 
    var hash = obj.ResourceId + '_' + obj.StartDate; 
 
    collectionByHash[hash] = collectionByHash[hash] || 0; 
 
    collectionByHash[hash] += obj.Hours; 
 
    }); 
 
    collection.forEach(function(obj) { 
 
    var hash = obj.ResourceId + '_' + obj.StartDate; 
 
    obj.TotalHrs = collectionByHash[hash]; 
 
    }); 
 
} 
 

 
populateTotalHrs(data); 
 
console.log(data);

0

あなたはResourceIdStartDateによって、それは一時的なハッシュテーブルとグループを使用することができます。 ` '開始日' = 'のような

var data = [{ Id: 1, ResourceId: 1, StartDate: '01-01-2017', Hours: 8, TotalHrs: 8 }, { Id: 2, ResourceId: 1, StartDate: '01-01-2017', Hours: 4, TotalHrs: 4 }, { Id: 3, ResourceId: 1, StartDate: '01-03-2017', Hours: 4, TotalHrs: 4 }, { Id: 4, ResourceId: 1, StartDate: '01-03-2017', Hours: 4, TotalHrs: 4 }, { Id: 5, ResourceId: 2, StartDate: '01-01-2017', Hours: 2, TotalHrs: 2 }, { Id: 6, ResourceId: 2, StartDate: '01-01-2017', Hours: 4, TotalHrs: 4 }, { Id: 7, ResourceId: 2, StartDate: '01-03-2017', Hours: 2, TotalHrs: 2 }]; 
 

 
data.forEach(function (hash) { 
 
    return function (a) { 
 
     var key = [a.ResourceId, a.StartDate].join('|'); 
 
     if (!hash[key]) { 
 
      hash[key] = [a]; 
 
      return; 
 
     } 
 
     hash[key].push(a); 
 
     hash[key][0].TotalHrs += a.Hours; 
 
     hash[key].forEach(function (b) { 
 
      b.TotalHrs = hash[key][0].TotalHrs; 
 
     }); 
 
    }; 
 
}(Object.create(null))); 
 

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

関連する問題