如何在Firebase中处理空数组?

时间:2013-03-14 11:48:51

标签: arrays firebase

person可以有多个carscar可以有多个accidents。所以我们可以:

# Person with no cars
person:
  name: "Misha"
  cars: []

# Person with free-accident car
person:
  name "Arlen"
  cars:
    0:
      name: "Toyota"
      accidents: []

Firebase将这些人存储为:

person:
  name: "Misha"

person:
  name "Arlen"
  cars:
    0:
      name: "Toyota"

因此在JavaScript中我必须执行以下操作来恢复空数组:(CoffeeScript)

if person.cars?
  for car in person.cars
    car.accidents = [] unless car.accidents?
else
  person.cars = []

在没有编写这些不必要的JavaScript代码的情况下,有没有更好的方法来处理Firebase中的空数组?

2 个答案:

答案 0 :(得分:13)

我认为,如果我理解核心问题,简短的回答是没有办法强制空数组进入Firebase。但是,有一些范例可能比你上面的更好。

请记住,Firebase是一个实时环境。汽车和事故的数量可以(并且将会)随时改变。最好将所有内容视为实时到达的新数据,避免考虑存在或不存在。

// fetch all the people in real-time
rootRef.child('people').on('child_added', function(personSnapshot) {

   // monitor their cars
   personSnapshot.ref().child('cars', 'child_added', function(carSnapshot) {

       // monitor accidents
       carSnapshot.ref().child('accidents', 'child_added', function(accidentSnapshot) {
           // here is where you invoke your code related to accidents
       });
   });
});

请注意,不需要if exists/unless类型逻辑。请注意,您可能还希望监控child_removedcars上的people并致电ref.off()以停止收听特定的孩子。

如果出于某种原因你想坚持使用静态模型,那么forEach将成为你的朋友:

// fetch all the people as one object, asynchronously
// this won't work well with many thousands of records
rootRef.child('people').once('value', function(everyoneSnap) {

   // get each user (this is synchronous!)
   everyoneSnap.forEach(function(personSnap) {

        // get all cars (this is asynchronous)
        personSnap.ref().child('cars').once('value', function(allCars) {

           // iterate cars (this is synchronous)
           allCars.forEach(function(carSnap) { /* and so on */ });

        });

   });   
});

请注意,即使使用forEach,也不需要“存在或除非”的逻辑。

答案 1 :(得分:4)

我通常使用DataSnapshot函数numChildren()来查看它是否为空,不像这样

var fire = new Firebase("https://example.firebaseio.com/");
fire.once('value', function(data){if (data.numChildren() > 0){ /*Do something*/ });