如何将日期变量作为对象键存入Firebase Realtime Database
问题原因
JS 对象字面量的键默认会被解析为固定字符串,直接写 { today: dataObject } 时不会读取同名变量的值,因此会存储为 "today" 键。你第二段代码使用的是对象属性简写规则,等价于 { today: today, dataObject: dataObject },结构不符合「日期为键、数据为值的单键对象」的需求。
最优解决方案
使用 ES6 计算属性语法,将变量用方括号包裹即可把变量值作为对象的键,同时建议提前将日期格式化为标准字符串,避免 Date 对象序列化带来的异常:
// 格式化日期为 YYYY-MM-DD 格式,可根据需求调整格式 const today = new Date().toISOString().split('T')[0]; firebase.database() .ref(`users/${user.uid}`) .set({ // 方括号包裹变量表示用变量值作为对象键 data: [{ [today]: dataObject }], });
追加数据+自动排序的优化写法
如果你需要往已有的 data 数组中追加新的日期数据而非覆盖整个数组,搭配事务操作可以保证数据一致性且自动按日期排序:
const today = new Date().toISOString().split('T')[0]; const userRef = firebase.database().ref(`users/${user.uid}`); userRef.child('data').transaction(currentData => { const dataArray = currentData || []; // 追加当日数据 dataArray.push({ [today]: dataObject }); // 按日期升序排序 dataArray.sort((a, b) => { const dateA = Object.keys(a)[0]; const dateB = Object.keys(b)[0]; return new Date(dateA) - new Date(dateB); }); return dataArray; });
更高性能的存储方案
如果你的使用场景不需要严格的数组结构,更推荐直接将 data 存为日期为键的对象,读写性能远高于数组操作,需要排序时再临时转换即可:
// 存数据:直接写入对应日期节点,无需操作整个数组 const today = new Date().toISOString().split('T')[0]; firebase.database() .ref(`users/${user.uid}/data/${today}`) .set(dataObject); // 读数据:取出后自行排序为需要的数组结构 userRef.child('data').get().then(snapshot => { const dataMap = snapshot.val() || {}; const sortedData = Object.keys(dataMap) .sort() .map(date => ({ [date]: dataMap[date] })); // sortedData 即为按日期升序排列的数组 });
内容的提问来源于stack exchange,提问作者Commando
相关产品推荐
相关产品推荐

