You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将日期变量作为对象键存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:39:05