Angular2中如何合并Firebase返回的同日期多对象为单对象?
合并Firebase返回的同日期数据数组
嘿,这个合并相同日期数据的需求不难搞定,我给你梳理个清晰的解法!
首先明确我们要达成的目标:把Firebase返回的包含重复日期的对象数组,按日期分组,每个日期对应一个独立对象,其中date属性保留不变,相关的数值字段(比如paidAmount和purpose)都存入该对象的data数组中。
解法思路
核心逻辑就是按日期分组归集:先用一个临时对象暂存每个日期对应的数据,遍历原始数组时,把相同日期的项都归集到同一个日期的data数组里,最后再把这个临时对象转换成我们需要的数组格式。
代码实现(JavaScript)
假设这是你从Firebase获取的原始数据:
// 模拟Firebase返回的原始数据 const rawFirebaseData = [ { date: "21/02/2018", paidAmount: 850, purpose: "Medicine" }, { date: "21/02/2018", paidAmount: 100, purpose: "Treatment" }, { date: "21/02/2018", paidAmount: 200, purpose: "Treatment" }, { date: "20/02/2018", paidAmount: 400, purpose: "Consultation" } ];
接下来是具体的合并逻辑:
// 创建临时对象用于按日期分组 const dateGroups = {}; // 遍历原始数据进行分组处理 rawFirebaseData.forEach(item => { // 解构分离出日期字段和其余数据 const { date, ...details } = item; // 如果当前日期还未初始化分组,先创建对应的结构 if (!dateGroups[date]) { dateGroups[date] = { date, data: [] }; } // 将当前项的详细数据添加到对应日期的data数组中 dateGroups[date].data.push(details); }); // 将分组对象转换为最终的数组格式 const mergedData = Object.values(dateGroups); // 输出结果,就是你想要的格式啦! console.log(mergedData);
代码说明
- 用
forEach遍历原始数组,通过解构赋值把date和其他业务字段快速分开; - 临时对象
dateGroups以日期字符串为键,每个键对应的值是包含date和data数组的对象; - 每次遍历到一个项,就把它的非日期字段(
paidAmount和purpose)push到对应日期的data数组里; - 最后用
Object.values()把临时对象的所有值提取出来,转换成数组,就是合并后的最终结果。
额外提示
如果你的Firebase返回的日期格式存在不一致(比如有的是21/02/2018,有的是2018-02-21),建议先统一日期格式,再进行分组操作,避免因为格式差异导致相同日期被当成不同键处理。比如可以用Date对象把日期转换成统一的ISO字符串格式。
内容的提问来源于stack exchange,提问作者srujana
相关产品推荐
相关产品推荐

