Преобразование объекта Firebase объектов в массив JavaScript / Typescript - PullRequest
0 голосов
/ 14 декабря 2018

Я использую Firebase с приложением Ionic3 / Angular4.

Данные в базе данных Firebase Realtime выглядят так:

database structure

С кодом 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 (), и я смотрю на это часами!

Может ли кто-нибудь помочь?

Спасибо!

1 Ответ

0 голосов
/ 15 декабря 2018

Это просто преобразование данных в JavaScript. Выполните итерацию свойств объекта в dishes и создайте массив только значений этих свойств.Затем перезапишите исходное свойство этим новым массивом.Для каждого объекта o в массиве, что-то вроде этого:

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

Если вы ориентируетесь на более новые версии JavaScript, вы могли бы сделать это еще проще с o.dishes = Object.values(o.dishes).

...