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

Firestore如何从含映射数组的文档中提取数据转为可用数组

问题:从Firestore文档提取映射数组并转为表格数据

我是自学新手,若有浅显问题还请见谅。我尝试用getDoc获取Firestore里的文档,把里面的数据转成数组用作表格数据。我已经把数据存在包含dataExcel对象(内部是映射数组)的文档里,存储代码如下:

const submitGrades = async () => {
    await setDoc(doc(db, 'EventData', 'Game 1' + ' PlayData'), {dataExcel})
    await setDoc(doc(db, "EventData", 'Game 1' + ' PlayerData'), {playerData})
}

我知道这个结构不适合复杂查询,但只要拉取整份文档后用JavaScript排序就行。我已经通过下面的代码成功获取文档:

const Fetch = async () => {
    const dataRef = doc(db, 'EventData', 'Game 1 PlayData');

    const data = await getDoc(dataRef);
    console.log(data);
}

但我没法提取其中的映射数组、存入状态并用作表格数据。当前数据结构是文档内嵌套dataExcel对象,dataExcel里是带键的数组项;目标是把这些数据转成可直接用于表格的数组格式。


解决方案

步骤1:提取文档中的dataExcel数据

用data.data()获取文档的纯数据对象,然后取出dataExcel:

const Fetch = async () => {
    const dataRef = doc(db, 'EventData', 'Game 1 PlayData');
    const docSnap = await getDoc(dataRef);
    
    if (docSnap.exists()) {
        // 获取文档里的dataExcel对象
        const rawData = docSnap.data().dataExcel;
        console.log(rawData);
    } else {
        console.log("文档不存在");
    }
}

步骤2:将映射数组转为表格可用的数组

把dataExcel里的每个键对应的对象提取出来,组成新数组:

const Fetch = async () => {
    const dataRef = doc(db, 'EventData', 'Game 1 PlayData');
    const docSnap = await getDoc(dataRef);
    
    if (docSnap.exists()) {
        const rawData = docSnap.data().dataExcel;
        // 将对象的值转为数组(即提取每个映射项)
        const tableData = Object.values(rawData);
        console.log(tableData); // 这就是表格可用的数组格式
    } else {
        console.log("文档不存在");
    }
}

步骤3:存入状态(以React为例)

如果是React项目,用useState存储表格数据:

import { useState, useEffect } from 'react';
import { doc, getDoc } from "firebase/firestore";
import { db } from './firebaseConfig'; // 替换成你的Firebase配置路径

const YourComponent = () => {
    const [tableData, setTableData] = useState([]);

    useEffect(() => {
        const fetchData = async () => {
            const dataRef = doc(db, 'EventData', 'Game 1 PlayData');
            const docSnap = await getDoc(dataRef);
            
            if (docSnap.exists()) {
                const rawData = docSnap.data().dataExcel;
                const formattedData = Object.values(rawData);
                setTableData(formattedData);
            } else {
                console.log("文档不存在");
            }
        };

        fetchData();
    }, []);

    // 渲染表格
    return (
        <table>
            <thead>
                <tr>
                    {/* 假设你的数据有这些字段,根据实际调整 */}
                    <th>姓名</th>
                    <th>分数</th>
                    <th>时间</th>
                </tr>
            </thead>
            <tbody>
                {tableData.map((item, index) => (
                    <tr key={index}>
                        <td>{item.name}</td>
                        <td>{item.score}</td>
                        <td>{item.time}</td>
                    </tr>
                ))}
            </tbody>
        </table>
    );
};

export default YourComponent;

额外说明

如果dataExcel里的键需要排序后再提取,可以用Object.entries先获取键值对,排序后再提取值:

// 按键名排序后提取值
const formattedData = Object.entries(rawData)
  .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))
  .map(([key, value]) => value);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:20:35