Reactjs Firebase orderByChild未返回数组

Reactjs Firebase orderByChild未返回数组,reactjs,firebase,firebase-realtime-database,Reactjs,Firebase,Firebase Realtime Database,我正试图从我的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-4

我正试图从我的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()):

结果:预期日志

但现在,当我将equalTo()字段更改为“general”(其他图标的类型)时,它不会返回数组

  componentWillMount = () => {
    database.ref('icons').orderByChild('type').equalTo('general').on('value', snap => {
      // this.setState({ icons: snap.val() });
      console.log(snap.val());
    })
  }
结果:输出错误

如您所见,它现在返回的是一个对象而不是数组。 现在我的问题是:如何解决这个问题,使类型“general”也返回一个数组

谢谢。

基于Firebase val()方法可以返回不同的数据类型

根据DataSnapshot中的数据,val()方法可能返回标量类型(字符串、数字或布尔值)、数组或对象。它还可能返回null,表示DataSnapshot为空(不包含数据)

如果需要迭代返回的值,最好使用forEach()方法。

基于Firebase val()方法可以返回不同的数据类型

根据DataSnapshot中的数据,val()方法可能返回标量类型(字符串、数字或布尔值)、数组或对象。它还可能返回null,表示DataSnapshot为空(不包含数据)


如果需要迭代返回的值,最好使用forEach()方法。

Firebase实时数据库不存储数组。相反,它将它们存储为常规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.log(result);
})
另见:


Firebase实时数据库不存储阵列。相反,它将它们存储为常规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.log(result);
})
另见:


谢谢!我不知道,谢谢!我不知道。