【问题标题】:Converting a Firebase object of objects into a JavaScript/Typescript array将对象的 Firebase 对象转换为 JavaScript/Typescript 数组
【发布时间】:2019-05-16 02:44:36
【问题描述】:

我将 Firebase 与 Ionic3 / Angular4 应用程序一起使用。

Firebase 实时数据库中的数据如下所示:

使用下面的 TS 代码,我正在从 Firebase 检索可观察数据...

getDishesCategories(uid: string) {

    // 1. Fetch an observable AngularFire database snapshot

    const afDishCategoriesList$ = this.database.list<DishCategory>(`/users/${uid}/dishcategories/`).snapshotChanges()

    // 2. Map the AF list to an observable list of dish category objects

    const dishCategoriesList$ = afDishCategoriesList$.pipe(map(changes => {
      return changes.map(c => ({
      ...c.payload.val()
      }))
    }))

    // 3. return the observable list of dish objects

    return dishCategoriesList$
}

这给了我以下信息:

[{
    createdDate: "2018-12-14T15:59:25.345Z",
    dishes: { ozvawkfci1dadyuibgdy4: {name: "Dish 1", selected: true} },
    id: "default01",
    name: "All Dishes",
    selected: true,
    toggleDisabled: true
}]

问题是“菜肴”数据仍以 JSON 形式接收,Firebase 键和值作为对象。

我正在尝试将对象的“菜肴”对象映射到标准数组中,因此我可以在其上调用 .length() 之类的方法,并使用索引而不是键。

这就是我正在尝试的(菜肴也映射到数组):

[{
    createdDate: "2018-12-14T15:59:25.345Z",
    dishes: [ {name: "Dish 1", selected: true} ],
    id: "default01",
    name: "All Dishes",
    selected: true,
    toggleDisabled: true
}]

我在这里不需要 Firebase 键,只是一个沼泽标准零索引数组,每道菜在每个索引处存储为一个对象。只是无法想象如何做到这一点,因为我是 .map() 的新手,而且我已经盯着它看了好几个小时了!

有人可以帮忙吗?

谢谢!

【问题讨论】:

  • 我认为,如果您明确定义(使用 JSON 样式语法,而不是屏幕截图),您拥有的对象的结构,以及您想要的对象的结构,会更容易。您可能只需要执行一些基本的从一件事到另一件事的翻译。
  • 哦,嘿,道格!我一直在看你的视频——真的很有帮助,非常感谢那些:)。好的,我会在明天添加这个细节,我今晚要休息一下!干杯
  • OK 忍不住了!我已经编辑了 Doug 的原始帖子,这是否使它更清晰?在此先感谢 ;)

标签: javascript json firebase firebase-realtime-database angularfire


【解决方案1】:

这只是 JavaScript 中的一个简单数据转换。 Iterate the properties of the object in dishes 并构建一个仅包含这些属性值的数组。然后用该新数组覆盖原始属性。对于数组中的每个对象o,如下所示:

o.dishes = Object.keys(o.dishes).map(key => o.dishes[key])

如果您的目标是较新版本的 JavaScript,您可以使用 o.dishes = Object.values(o.dishes) 更轻松地做到这一点。

【讨论】:

  • 啊,当然!我早上试试。感谢您的帮助,非常感谢:)
  • 嗨,Doug,当我订阅 dishCategoriesList$ 数据并在类别上运行 forEach() 循环时,o.dishes = Object.keys(o.dishes).map(key =&gt; o.dishes[key]) 工作得很好。理想情况下,我想在上面的getDishesCategories 方法的第 2 步中进行映射时执行此转换 - 因此,当我从应用程序中的任何位置订阅数据时,它已经正确转换。我无法让它工作。我很欣赏这是基本的东西,但迭代对象属性和使用 map 对我来说真的很新鲜。谢谢!
  • 你不会把它放在传递给 pipe() 的 lambda 中吗?
  • 是的 - 明白了!谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2022-09-27
  • 2021-06-20
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多