javascript - 根据数组计算对象的求和值并更新为总计

标签 javascript jquery grouping

我有一个对象,它基本上包含三个重要参数,用于总计算。 例如我的对象如下:

[
{'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 参数与 Hours 参数具有相同的值。

我希望它是特定 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 : 01-01-2017 出现两次,Hours 值分别为 8 和 4,因此 TotalHrs 变为 8 +4=12。

此外,我不想分组,我希望结果数组中的元素数量相同,但 TotalHrs 的值更新。

最佳答案

使用 Array.prototype.reduce() 的简短解决方案和 Array.prototype.forEach()功能:

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这是一个哈希键字符串,用于对具有相同 ResourceId 的条目进行分组和StartDate属性

关于javascript - 根据数组计算对象的求和值并更新为总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42366106/

相关文章:

javascript - 解析日期 YYYYMMDD'T'HHmmss.sss'Z'

javascript - 从变量值动态填充 JSON 数组

javascript - 即使 Ajax 调用未在 Select2 中返回任何结果,也将值保留在输入中

python - 如何使用 groupby 在 python pandas 中连接字符串?

java - 如何将字符串数组分组到 map ?

Mongodb聚合管道如何限制组推送

javascript - 在将参数传递到 Jade 文件时,我可以(如何)使用 Jade 速记吗?

javascript - 在 jQuery 中组合多个选择器

javascript - 在所有这些情况下提取 id

javascript - 在javascript IE中从字符串创建子数组