2017-03-10 15 views
2

私は、次のような構造を持つfirebase databseを持っている:firebaseオブジェクトのプロパティを配列としてリストする方法は?

list of my database structure

は、これらのランダムのUIDの各々はcreatorroomNameを持っています。私は["Holy Robert Louis Stevenson", "Holy Sardine", "Holy Gunpowder"]のように、アレイ内のすべてのroomNameを表示しようとしていますが、[Object, Object, Object]

はここに私のコードであるとして、それは常に表示されます。私はconsole.log('firebaseHolyArray: ', Object.values(snap.val())["roomName"]);を試してみましたHAV

const dbRef = firebase.initializeApp(config).database().ref().child('rooms'); 
... 
    componentDidMount(){ 
    dbRef.on('value', snap => { 
     console.log(snap.val()); 
     console.log('firebaseHolyArray: ', Object.values(snap.val())); 
    }); 
    } 

が、それは未定義表示されます。配列形式でroomNameの値を表示するにはどうすればよいですか?

私は snap.val()はこのような何か戻っていると思います

答えて

4

を参照してください:

dbRef.on('value', snap => { 
    var data = []; 
    snap.forEach(ss => { 
     data.push(ss.child('name').val()); 
    }); 
    console.log(data); 
}); 

Object.valuesで複数の反復を実行する必要は(ありません)またはアンダースコアを使用します。どちらも、ここでは順序が乱れたデータやその他の合併症を引き起こす可能性があります。

また、child_addedなどのリストを扱う場合は、recommended practicesを使用するのが理想的です。

-1

:私たちはこのように、オブジェクトの配列にそれを変換するためにObject.values(snap.val())を使用することができます

{ 
    "-KeoiS8luCsuKhzc_Eut": { "creator": "Robin", "roomName": "Holy Robert Louis Stevenson" }, 
    "-Keol-2Si05dmkmuac8l": { "creator": "Robin", "roomName": "Holy Sardine" }, 
    "-KeooOxSoYNdNk6g5DMw": { "creator": "Robin", "roomName": "Holy Gunpowder" } 
} 

を:

[ 
    { "creator": "Robin", "roomName": "Holy Robert Louis Stevenson" }, 
    { "creator": "Robin", "roomName": "Holy Sardine" }, 
    { "creator": "Robin", "roomName": "Holy Gunpowder" } 
] 

その後、我々は抽出したいです各オブジェクトのルーム名。この場合、配列mapメソッドは、オブジェクトを必要なものに変換するのに役立ちます。最終的には、次のようになるはずです:

var rooms = Object.values(snap.val()).map(function(obj) { 
    return obj.roomName; 
}); 
console.log('firebaseHolyArray: ', rooms); 

これはオブジェクトの配列を取り、それぞれを関数に渡します。この関数では、オブジェクトのどの部分を終了するかを返すことができます。この場合は、roomNameです。あなたは簡単に印刷することができるこれらの配列を残します。

+0

'Uncaught TypeError:snap.val(...)。mapは関数ではありません。 '私はあなたがこれで行くところを見ていると思う。 – Iggy

+0

@ikichaは、これで少し上手くいくでしょう: 'Object.values(snap.val())。map' ...おそらく代わりにそれを試してみませんか? – dbburgess

+0

'snap.val()'が配列を返すと仮定しましたが、オブジェクトとして返されていれば私のアプローチはうまくいかないでしょう。 'Object.values'はそれを配列に変換し、' map'がそれを魔法にすることを許可します。 – dbburgess

0

Object.values()戻り[]オブジェクト。

だから、それは "roomName" 属性をcotainしません。

私はあなたが摘むためmapを使用すると思います。ここで

はコード

console.log('firebaseHolyArray: ', Object.values(snap.val()).map((v) => v.roomName); 

あなたはアンダースコアを使用する場合は、underscore.pluck使用することができます。

console.log('firebaseHolyArray: ', _.pluck(Object.values(snap.val()), "roomName")); 

あなたはFirebaseデータから適切に順序付けられたリストを生成しますforEach() methodを、使用することができますhttp://underscorejs.org/#pluck