将对象的 Firebase 对象转换为 JavaScript/Typescript 数组

Converting a Firebase object of objects into a JavaScript/Typescript array

我在 Ionic3 / Angular4 应用程序中使用 Firebase。

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
}]

问题是 'dishes' 数据仍作为 JSON 接收,使用 Firebase 键和值作为对象。

我正在尝试将对象的 'dishes' 对象映射到标准数组中,这样我就可以在其上调用 .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() 的新手,所以无法想象如何做到这一点,我已经盯着它看了好几个小时了!

有人能帮忙吗?

谢谢!

这只是 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) 更轻松地完成此操作。