按javascript或angularjs分组

Group by in javascript or angularjs

本文关键字:分组 angularjs javascript      更新时间:2023-09-26

我只想根据年份和我的数据在下面做和值列,但我不知道如何使用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);