2013-03-14 7 views
12

と言うと、personは複数のcarsを持つことができ、carは複数のaccidentsを持つことができます。だから我々は持っている可能性があり:Firebaseで空の配列を扱うには?

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

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

Firebase店舗、これらの人々のように:だから、JavaScriptで、私は空の配列復元するために、次の操作を行う必要はあり

person: 
    name: "Misha" 

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

:(CoffeeScriptのを)

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

この不要なJavaScriptコードを記述しなくても、空の配列をFirebaseで処理するより良い方法はありますか?

答えて

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_removedcarspeopleで監視し、特定の子供の聴取を中止する場合は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ので、「存在するかしない限り」のソートの必要がありませんか、論理。

+0

グレート答え加藤のように、参照してください! –

4

私は通常(DataSnapshot機能するnumChildrenを使用)、それはないの空の場合、この

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