按javascript或angularjs分组
Group by in javascript or angularjs
我只想根据年份和我的数据在下面做和值列,但我不知道如何使用angular(在脚本中)或javascript做到这一点。
[
{"Year":2013,"Product":"A","Value":0},
{"Year":2013,"Product":"B","Value":20},
{"Year":2013,"Product":"A","Value":50},
{"Year":2014,"Product":"D","Value":55},
{"Year":2014,"Product":"M","Value":23},
{"Year":2015,"Product":"D","Value":73},
{"Year":2015,"Product":"A","Value":52},
{"Year":2016,"Product":"B","Value":65},
{"Year":2016,"Product":"A","Value":88}
]
我想对Value列执行求和,并删除Product列。由于
Edit正如评论者指出的那样,这甚至不需要Lodash。在当前的项目中使用Lodash太多了,我忘记了reduce
是内置的。: -)
也已更新,将数据放入所需的形式[{"yyyy" : xxxx},...]
。
下面的代码将完成以下操作:
var data = [{"Year":2013,"Product":"A","Value":0},{"Year":2013,"Product":"B","Value":20},{"Year":2013,"Product":"A","Value":50},{"Year":2014,"Product":"D","Value":55},{"Year":2014,"Product":"M","Value":23},{"Year":2015,"Product":"D","Value":73},{"Year":2015,"Product":"A","Value":52},{"Year":2016,"Product":"B","Value":65},{"Year":2016,"Product":"A","Value":88}];
var sum = data.reduce(function(res, product){
if(!(product.Year in res)){
res[product.Year] = product.Value;
}else{
res[product.Year] += product.Value;
}
return res;
}, {});
result = [];
for(year in sum){
var tmp = {};
tmp[year] = sum[year];
result.push(tmp);
}
console.log(result);
结果: [{"2013" : 70}, {"2014" : 78}, {"2015" : 125}, {"2016" : 153}]
原始回答
我能想到的最简单的方法是使用Lodash Library。它为您提供了一些不错的函数式编程能力,如reduce
,它基本上逐个对数组或集合的每个元素应用函数,并累加结果。
在本例中,如果您使用Lodash,您可以这样做:
var data = [{"Year":2013,"Product":"A","Value":0},{"Year":2013,"Product":"B","Value":20},{"Year":2013,"Product":"A","Value":50},{"Year":2014,"Product":"D","Value":55},{"Year":2014,"Product":"M","Value":23},{"Year":2015,"Product":"D","Value":73},{"Year":2015,"Product":"A","Value":52},{"Year":2016,"Product":"B","Value":65},{"Year":2016,"Product":"A","Value":88}];
result = _.reduce(data, function(res, product){
if(!(product.Year in res)){
res[product.Year] = product.Value;
}else{
res[product.Year] += product.Value;
}
return res;
}, {});
这个收益率:
{
"2013": 70,
"2014": 78,
"2015": 125,
"2016": 153
}
基本上,我们告诉Lodash的是,我们想要逐个遍历data中的所有元素,对每个元素执行一些操作。我们将把这个操作的结果保存在一个名为res
的变量中。最初,res
只是一个空对象,因为我们没有做任何事情。当Lodash查看每个元素时,它检查Product的年份是否在res
中。如果是,我们只需将Value
添加到res
中的年份。如果不是,我们将res
中的Year设置为当前产品的Value
。这样我们就可以把每年的产品价值加起来。
如果你想尝试一下,你可以在这里做:在线Lodash测试仪
干杯!
您可以使用普通JavaScript来完成此操作。我们使用一个对象来保存结果和forEach
数组方法。保存结果的对象的键值应该是年份,值应该是相应值的和。
var data = [
{"Year":2013,"Product":"A","Value":0},
{"Year":2013,"Product":"B","Value":20},
{"Year":2013,"Product":"A","Value":50},
{"Year":2014,"Product":"D","Value":55},
{"Year":2014,"Product":"M","Value":23},
{"Year":2015,"Product":"D","Value":73},
{"Year":2015,"Product":"A","Value":52},
{"Year":2016,"Product":"B","Value":65},
{"Year":2016,"Product":"A","Value":88}
];
groupedData = {};
data.forEach(function(item){
var year = item.Year;
var value = item.Value;
if(groupedData.hasOwnProperty(year)){
groupedData[year]+=value;
}else{
groupedData[year]=value;
}
});
console.log(groupedData);
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- AngularJS:我可以跳过函数参数回调吗
- AngularJS UI路由器不能像ng路由器那样工作
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 如何包含特定于每个视图angularjs的javascript文件
- AngularJS:ng之后,重复$scope值未按预期更新
- AngularJS-在JSON选择器中使用变量名
- $window.ga在AngularJS事件中未定义
- AngularJS-使用'true'属性
- 打开一个模态并将其链接到AngularJS中的指令
- 通过使用AngularJs进行分组来填充下拉列表
- AngularJs 分组方式在 ng-repeat.
- Angularjs对记录中某个字段的数据进行分组
- 使用AngularJs和MVC在Accordion中分组数据和显示
- 按javascript或angularjs分组
- 如何创建标记,将AngularJS的ng-repeat输出按日期(月)分组
- 在使用Angularjs过滤分组内容时隐藏分组头
- AngularJS:自定义迭代/数据转换和分组…当简单的ng-repeat只是won'
- 如何在单循环中过滤和分组angularjs中的产品
- AngularJS:先分组后排序