2016-05-17 23 views
1

Ich bin in eine seltsame Frage laufen, wo ich einmal einen Wert zu einem Objekt Firebase drücken, passieren zwei Dinge:Firebase-Werte werden ordnungsgemäß abgerufen, können aber nicht abgerufen werden?

  1. ich es nicht im Array zugreifen kann ich erhalten, wenn ich das Objekt von Firebase ziehen.
  2. Das Array, das ich erhalte, hat keine length Eigenschaft.

Hier ist, was meine Firebase Struktur wie folgt aussieht:

"user_solutions": { 
    "0": 
     { 
      "user_id": 0, 
      "clue_id": 0, 
      "hunt_id": 0, 
      "completed": 1 
     }, 
    "1": 
     { 
      "user_id": 0, 
      "clue_id": 1, 
      "hunt_id": 0, 
      "completed": 0 
     }, 
    "2": 
     { 
      "user_id": 0, 
      "clue_id": 1, 
      "hunt_id": 1, 
      "completed": 0 
     } 
    }, 
    "-KHxBMZwVMzyiMIcbMdr": 
     { 
     clue_id: 1, 
     completed: 0, 
     hunt_id: 0, 
     user_id: 0 
    } 

Hier ist die problematische Funktion ist:

userSolutionsRef.orderByChild('user_id').startAt(0).endAt(0).once('value', (snap) => { 
     var solution = snap.val(); 
     for (var i = 0; i < solution.length; i++) { 
      if (solution[i].hunt_id == 0) { 
       solutionsForThisHunt.push(solution[i]); 
      } 
     } 
     this.populateArray(solutionsForThisHunt); 
    }); 

Wenn ich den Debugger ausführen, hat solution den Wert Object {0: Object, 1: Object, 2: Object, -KHxBMZwVMzyiMIcbMdr: Object}, aber die length Eigenschaft ist nicht definiert. solutionsForThisHunt wird nie ausgefüllt. Außerdem kann ich auf die Objekte einzeln im Debugger über snap.val()[0]/snap.val()[1]/snap.val()[2] zugreifen, aber aus irgendeinem Grund, wenn ich versuche, auf snap.val()[3] zugreifen, ist es nicht definiert, obwohl es sollte ausgefüllt werden.

+0

Liefert 'snap.val' ein reelles Array oder ein anderes iterables? Was gibt 'Array.isArray' zurück? (https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray) –

+0

Sie haben Recht! Ich hatte den Eindruck, dass es ein Array zurück gab, aber es war nur ein iterables. Ihre Lösung hat funktioniert, danke. – user3802348

+0

Firebase gibt hier kein Array zurück, da es so aussieht, als hätten Sie Ihre Schlüssel als Strings gespeichert. [Speichern sie als ganze Zahlen würde einen Unterschied machen] (https://www.firebase.com/docs/rest/guide/understanding-data.html#section-arrays-in-firebase), obwohl ich immer nicht empfehlen würde [hängt von der Array-Semantik ab, wenn es um Firebase geht] (https://www.firebase.com/docs/rest/guide/saving-data.html#section-post). –

Antwort

3

Lösung scheint ein Objekt mit Schlüsseln, anstatt ein Array zu sein. Sie könnten folgendes tun

var solution = snap.val(); 
var array = Object.keys(solution).map(key => ({ ...solution[key], id: key })); 
for .... 
Verwandte Themen