Firebase orderByChild не возвращает массив

Я пытаюсь получить некоторые данные из своей базы данных firebase, но застрял на одной маленькой проблеме.

Это моя цель:

{
  "icons": [
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fdog.png?alt=media&token=08e0e162-8a72-467b-acdd-4085ac35e9c5",
      "alt": "Dog icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fcat.png?alt=media&token=1e58598b-00dc-4684-a349-00e1f9161256",
      "alt": "Cat icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Ffish.png?alt=media&token=614d7867-2d43-48b7-a3ad-2680de6c7e10",
      "alt": "Fish icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fbird.png?alt=media&token=a7020145-1a30-4728-a9bb-144716213e55",
      "alt": "Bird icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fhamster.png?alt=media&token=2ee69ccc-ef55-4219-850f-7c0c384aafb6",
      "alt": "Hamster icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F0_hamburger.png?alt=media&token=96c8779f-e261-448c-abce-41449b527f1f",
      "alt": "Burger icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F1_search.png?alt=media&token=194afb95-fd57-4a48-acb0-63893c7111fa",
      "alt": "Search icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F2_faq.png?alt=media&token=08f1e338-4e2b-4d72-a88f-4bbabf903da3",
      "alt": "Faq icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F3_divider.png?alt=media&token=e7dddb6e-a241-4819-8a35-5facfaf45dab",
      "alt": "Divider icon."
    }
  ]
}

Теперь, когда я использую этот запрос для выбора некоторых данных, я получаю желаемый результат (обратите внимание на equalTo ()):

  componentWillMount = () => {
    database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
      // this.setState({ icons: snap.val() });
      console.info(snap.val());
    })
  }

Результат: ожидаемый журнал

Firebase orderByChild не возвращает массив

Но теперь, когда я меняю поле equalTo () на «общее» - тип других значков - оно не возвращает массив.

  componentWillMount = () => {
    database.ref('icons').orderByChild('type').equalTo('general').on('value', snap => {
      // this.setState({ icons: snap.val() });
      console.info(snap.val());
    })
  }

Результат: неправильный вывод

Firebase orderByChild не возвращает массив

Как видите, теперь он возвращает объект вместо массива. Теперь мой вопрос: как я могу это исправить, чтобы тип «общий» также возвращал массив?

Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
474
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

на основе метода Firebase документы val () может возвращать разные типы данных

Depending on the data in a DataSnapshot, the val() method may return a scalar type (string, number, or boolean), an array, or an object. It may also return null, indicating that the DataSnapshot is empty (contains no data).

если вам нужно перебрать возвращаемые значения, лучше использовать метод forEach ().

Ответ принят как подходящий

База данных Firebase Realtime не хранит массивы. Вместо этого он хранит их как обычные объекты JavaScript, которые просто имеют последовательные числовые ключи. Таким образом, данные, которые вы храните, на самом деле хранятся следующим образом:

{
  "icons": {
    "0": { "type": "animal", "url": "...", "alt": "Dog icon." },
    "1": { "type": "animal", "url": "...", "alt": "Cat icon." },
    "2": { "type": "animal", "url": "...", "alt": "Dog icon." },
    "3": { "type": "animal", "url": "...", "alt": "Cat icon." },
    "4": { "type": "animal", "url": "...", "alt": "Dog icon." },
    ...
  }
}

Итак, когда вы выполняете свой запрос, вы получаете подмножество этих результатов. В вашем случае кажется, что вы получаете результаты с 5 по 8. Когда клиент Firebase получает результат, похожий на массив, он преобразует его обратно в массив. Но для этого требуется, например, чтобы индекс первого результата был 0, чего в данном случае нет. Поэтому вместо этого вы получаете необработанный результат из JSON.

Чтобы превратить его в массив, вы должны его преобразовать самостоятельно. Это довольно просто, например:

database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
  let result = [];
  snap.forEach(child => {
    result.push(child.val());
  });
  console.info(result);
})

Также см:

Спасибо! Не знал об этом.

PeeJee 29.11.2018 21:10

Другие вопросы по теме