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

如何从Firebase Realtime Database获取对象类型而非数组类型的数据

问题原因

你的代码默认请求返回的结果是数组结构,扩展运算符...仅能在数组字面量中展开可迭代对象(比如数组)。当Firebase Realtime Database返回键值对结构的对象时,直接对对象执行数组扩展不会得到有效内容,所以最终data是空数组。

补充说明:Firebase Realtime Database只有当节点下的子元素都是连续数字key时才会返回数组结构,其他场景都会返回对象结构,所以必须做格式兼容。

解决方法

先对接口返回的结果做格式判断,将对象转为数组后再存入state:

  • 如果不需要保留外层的key(即示例中的恐龙名称),可以直接用Object.values()取出所有属性值组成数组
  • 如果需要保留外层key作为数据的name字段,可以用Object.entries()遍历键值对后重组数据
修改后的核心代码
makeRemoteRequest = () => {
  const { page } = this.state
  const url = `https://example-default-rtdb.firebaseio.com/dinosaur.json`
  this.setState({ loading: true })

  fetch(url)
    .then(res => res.json())
    .then(res => {
      // 格式处理逻辑,兼容数组和对象返回结果
      const processedData = Array.isArray(res) 
        ? res 
        // 如果需要保留外层的恐龙名称作为name字段,替换成下面这行即可
        // : Object.entries(res).map(([name, detail]) => ({name, ...detail}))
        : Object.values(res)

      this.setState({
        // 同时修正原分页逻辑:page为1时应该重置数据,不需要拼接历史data
        data: page === 1 ? processedData : [...this.state.data, ...processedData],
        error: res.error || null,
        loading: false,
        fullData: processedData
      })
    })
    .catch(error => {
      this.setState({ error, loading: false })
    })
}

内容的提问来源于stack exchange,提问作者Hong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:57:03