如何遍历从snapshot.val()接收的数据并将其推送到基于键的数组

时间:2017-09-10 18:02:08

标签: javascript angular firebase ionic-framework ionic3

我希望根据用户密钥遍历从snapshot.val()收到的数据并将它们推送到数组中。我尝试在for..in循环的帮助下这样做,

firebase.database().ref('\interests').child("I would like to dine with").on('value', (snapshot) => {
  var data = snapshot.val();
  if(snapshot.exists()){
    for(let key in data){
      console.log("data[key]",data[key]);
      this.intVal.push(data[key]);
      console.log("intVal",this.intVal);
    }
  }
})

但我得到的是这样的东西,

enter image description here

如果您注意到,我的第一个数组在用户键下包含1个对象,而我的第二个数组在其用户键下包含3个对象。如何在单独的数组中推送每个值?

任何帮助将不胜感激!感谢

4 个答案:

答案 0 :(得分:8)

正是为了这个目的,有一个DataSnapshot.forEach() method

firebase.database().ref('\interests').child("I would like to dine with").on('value', (snapshot) => {
  snapshot.forEach((child) => {
    console.log(child.key, child.val()); 
    this.intVal.push(child.val());
    console.log("intVal",this.intVal);
  });
  }
})

答案 1 :(得分:4)

您可以为每个对象再次迭代数据

for(let key in data){
     console.log("data[key]",data[key]);
     for(innerKey in data[key]){
       var obj = {};
       obj[innerKey]=data[key][innerKey];
       this.intVal.push(obj);
     }
     console.log("intVal",this.intVal);
}

答案 2 :(得分:1)

尚未测试此代码,但应符合您的需要。

var interest = data.pop();//remove the interest
var uniq = data.reduce((unique, users) => {
    for (userId in users) {
        if (!userId in unique.IDs) {
            unique.IDs[userId] = users[userId];
            unique.usersList.push(users[userId]);
        }
    }
    return unique;
}, {IDs:{},usersList :[]});

console.log('interest is', interest);
console.log('uniq user ids', Object.keys(uniq.IDs));
console.log('uniq user list', uniq.usersList);

答案 3 :(得分:1)

使用数组地图可以解决我认为的所有痛苦。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map