如何使用 Javascript 访问数组中的单个对象

How to access individual object in array using Javascript

您好,我已经使用来自 Firebase 的 getDocs() 导出了数据(hawkers 集合)。

之后,我将每个 hawker 数据作为一个对象放入名为 allStall 的数组中,如下面的控制台日志屏幕截图所示.

问题 1 - 如何访问 allStall 数组中的每个单独对象。我尝试使用 .map() 访问其中的每一个,但我一无所获。

请注意,我的 allStall 数组中已经有数据,请参见上面的屏幕截图。 [Update] 地图在下面的代码中不起作用,因为字段是 stallname 而不是 stallName。但是,如果 using/call in/from other function.

则需要 async + await

问题 2 - 为什么 [[Prototype]]: Array(0) 在我的 allStall array

export /*Soln add async*/function getAllStall(){
  var allStall = [];
  try
  {
    /*Soln add await */getDocs(collection(db, "hawkers")).then((querySnapshot) =>
      {
        querySnapshot.forEach((doc) =>
          {
            var stall = doc.data();
            var name = stall.stallname;
            var category = stall.category;
            var description = stall.description;

            var stallData = {
              stallName:name,
              stallCategory:category,
              stallDescription:description
            };
            allStall.push(stallData);
});});

     console.log(allStall);

    //Unable to access individual object in Array of objects
    allStall.map(stall =>{console.log(stall.stallName);});}

  catch (e) {console.error("Error get all document: ", e);}

  return allStall;
}

在我的主 js 文件中,我执行了以下操作:

useEffect(/*Soln add await*/() =>
    {
        getAllStall();
        /*Soln:replace the statement above with the code below
        const allStall = await getAllStall();
        allStall.map((stall)=>console.log(stall.stallname));
       */
    }
);

你没有得到任何东西,因为 allStall 是空的,因为你没有等待承诺被履行

试试这个

export const getAllStall = () => getDocs(collection(db, "hawkers"))
       .then((querySnapshot) =>
           querySnapshot.map((doc) =>
              {
                const {stallName, category, description} =  doc.data();
            
            return  {
              stallName:name,
              stallCategory:category,
              stallDescription:description
            };
           
          });
      )

试试这样改变使用效果

useEffect(async () =>
    {
        const allStats = await getAllStall();
        console.log(allStats)
        allStats.forEach(console.log)
    }
);

非常感谢 R4ncid,您给了我灵感! 并感谢所有在下面发表评论的人!

我设法用 async 和 await 完成了它。最新更新,我也弄清楚了我以前的代码有什么问题。我在我的问题中评论了解决方案,即向函数添加异步并等待 getDocs。

此外,地图在上面的代码中不起作用,因为字段是 stallname 而不是 stallName。但是,如果使用来自其他函数的 in/calling,则需要异步 + 等待。

辅助函数

export async function getAllStall(){

  const querySnapshot = await getDocs(collection(db, "hawkers"));

  var allStall = [];

  querySnapshot.forEach(doc =>
    {
      var stall = doc.data();
      var name = stall.stallname;
      var category = stall.category;
      var description = stall.description;

      var stallData = {
        stallName:name,
        stallCategory:category,
        stallDescription:description
      };

      allStall.push(stall);
   }
  );

  
  return allStall;
}

主 JS 文件

useEffect(async () =>
        {
            const allStall = await getAllStall();
            allStall.map((stall)=>console.log(stall.stallname));
        }
    );

万岁