【问题标题】:Firebase snapshot returns object instead of array to iterate overFirebase 快照返回对象而不是数组以进行迭代
【发布时间】:2018-03-05 23:47:57
【问题描述】:

使用 Firebase 和 Angular 5,我使用快照方法来检索数据而不监听更改。我想保留每个项目的索引/键,因为它被用于链接以导航到单击项目的页面。

这里是 TS:

  features = [];
  notfeatures = [];
  constructor(private Svc: Service, private http: HttpClient){

    firebase.database().ref('/reviews').once('value').then((snapshot)=> {
      console.log("snapshot", (snapshot.val()));
    ..........

记录 (snapshot.val()) 给了我一个对象(我无法迭代):

-L6ZwjBbyi4jz21OEoST: {category: "Movies", contributor: "CF1", feature: "No", …}

randomkey1: {category: "Movies", contributor: "CF1", feature: "No", …}

randomkey2: {category: "Movies", contributor: "DS1", feature: "Yes", …}

randomkey3: {category: "TV", contributor: "KH1", feature: "No", …}

所以,我使用forEach 来一个一个地获取所有项目,并在满足条件时将它们推送到两个不同的数组中。

      ..........
      snapshot.forEach(snapshot => {
          console.log(snapshot.key, snapshot.val());
          if (snapshot.val().feature == "Yes") {
            this.features.push(snapshot.val())
            console.log("feature", this.features)
          }
          if (snapshot.val().feature == "No") {
            this.notfeatures.push(snapshot.val())
            console.log("notfeature", this.notfeatures)
          }
      });
    })

  }

但是,这样做意味着我丢失了导航所需的snapshot.key。 如何保留每个项目的 snapshot.key 以用于导航/数据目的?

【问题讨论】:

    标签: javascript angular firebase firebase-realtime-database


    【解决方案1】:

    首先,不能迭代snapshot.val() 返回的对象是不正确的。你当然可以iterate over the key/value pairs in a javascript object 使用for (x in y) 语法。

    但如果您想在保留唯一键的同时迭代快照中的子对象,您可以将该值放入子对象中:

    const val = snapshot.val()
    val.id = snapshot.key
    this.features.push(val)
    

    现在您有了一个快照对象,其中包含一个名为 id 的新属性,其中包含唯一键。

    【讨论】:

    • 如何推送val.id和对应的val
    • 什么意思?如果您按照我的建议将其作为属性添加到 val,它将成为您推送的对象的一部分。我更改了答案中的代码以反映这一点。
    • 啊,我明白了。我预计只有 snapshot.val() 被推送,因为它被声明为 val 并且 val 正在被推送。
    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多