Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6带和的嵌套分组_Javascript_Ecmascript 6_Lodash - Fatal编程技术网

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:我已经看过足够多的你的帖子了,我敢肯定你对它的工作有很好的了解!显然,上面的内容可以根据函子的合成定律进行修改,但我喜欢这是多么明确。我确信这段代码的性能明显低于您的版本,但在许多情况下——我敢说大多数情况下是这样的吗?——这种差异并不重要。