Javascript ES6带和的嵌套分组
我有这样一个数组:Javascript ES6带和的嵌套分组,javascript,ecmascript-6,lodash,Javascript,Ecmascript 6,Lodash,我有这样一个数组: [{ id: 1, amount: 10, date: '21/01/2017' },{ id: 1, amount: 10, date: '21/01/2017' },{ id: 1, amount: 30, date: '22/01/2017' },{ id: 2, amount: 10, date: '21/01/2017' },] 我希望这个输出像: { '21/01/2017': {
[{
id: 1,
amount: 10,
date: '21/01/2017'
},{
id: 1,
amount: 10,
date: '21/01/2017'
},{
id: 1,
amount: 30,
date: '22/01/2017'
},{
id: 2,
amount: 10,
date: '21/01/2017'
},]
我希望这个输出像:
{
'21/01/2017': {
1: {
amount: 20
},
2: {
amount: 10
}
},
'22/01/2017': {
1: {
amount: 30
}
}
}
基本上是按数据分组,按id嵌套分组,同时对相关金额求和
到目前为止,我已经尝试使用reduce,并研究了lodash函数,但都没有成功。Reduce使得按一个道具分组和求和变得很容易,但是我找不到一个优雅的方法来创建第二级。我创建了一个沙箱来演示:
const dataToConsolidate=[{
id:1,
金额:10,
日期:2017年1月21日
}, {
id:1,
金额:10,
日期:2017年1月21日
}, {
id:1,
金额:30,
日期:2017年1月22日
}, {
id:2,
金额:10,
日期:2017年1月21日
},]
导出常量合并=(数据)=>{
const result=data.reduce(函数(res,obj){
(!(对象日期以res表示))?
res.\uu数组推送(res[obj.date]=obj):
res[obj.date]。金额+=obj.amount;
返回res;
},{uuuu数组:[]});
返回结果;
};
log(console(consolid(dataToConsolidate))
您可以将对象作为哈希表,并使用默认样式添加属性
var数组=[{id:1,金额:10,日期:'21/01/2017'},{id:1,金额:10,日期:'21/01/2017'},{id:1,金额:30,日期:'22/01/2017'},{id:2,金额:10,日期:'21/01/2017'},
结果={};
array.forEach(函数(o){
结果[o.date]=结果[o.date]| |{};
结果[o.date][o.id]=结果[o.date][o.id]| |{金额:0};
结果[o.date][o.id]。金额+=o.amount;
});
控制台日志(结果)代码>
.as控制台包装{max height:100%!important;top:0;}
这里有一个相对ES6-y的解决方案,使用reduce
:
const initial=[{id:1,金额:10,日期:'21/01/2017'},{id:1,金额:10,日期:'21/01/2017'},{id:1,金额:30,日期:'22/01/2017'},{id:2,金额:10,日期:'21/01/2017'}];
const parse=obj=>obj.reduce((final,{date,id,amount})=>{
让组=最终[日期]=最终[日期]|{};
组[id]=组[id]|{金额:0};
组[id]。金额+=金额;
返回最终结果;
}, {});
const final=解析(初始);
控制台日志(最终)代码>作为该库的粉丝(免责声明:我是作者之一),我很可能会使用它使所有内容更加明确:
const{pipe,groupBy,prop,map,pull,sum}=R
常数数据=[
{“金额”:10,“日期”:2017年1月21日,“id”:1},
{“金额”:10,“日期”:2017年1月21日,“id”:1},
{“金额”:30,日期:2017年1月22日,id:1},
{“金额”:10,“日期”:2017年1月21日,“id”:2}
]
常数=管道(
分组人(道具(‘日期’),
地图(groupBy(prop('id')),
地图(地图(采摘(‘数量’)),
地图(地图(总和))
)
console.log(合并(数据))
。作为控制台包装{最大高度:100%!重要;顶部:0;}
您可以通过\uu.groupBy
来完成:
const res = _.chain(data)
.groupBy('date')
.mapValues(dateObj => _.chain(dateObj)
.groupBy('id')
.mapValues(idObj => ({ amount: _.sumBy(idObj, 'amount') }))
.value()
)
.value();
为什么结果是数组?我错了,更新了问题。input.reduce(函数(a,b){a[b.date]=a[b.date]|{};a[b.date][b.id]=a[b.date][b.id]|{amount:0};a[b.date][b.id]=b.amount b.amount;返回a;},{})代码>这行CSS的巧妙技巧,将从现在开始使用。我真的很惊讶ramda是如何工作的(如果我了解它是如何工作的…。@NinaScholz:我已经看过足够多的你的帖子了,我敢肯定你对它的工作有很好的了解!显然,上面的内容可以根据函子的合成定律进行修改,但我喜欢这是多么明确。我确信这段代码的性能明显低于您的版本,但在许多情况下——我敢说大多数情况下是这样的吗?——这种差异并不重要。