从Firebase创建JavaScript对象数组遇到问题求助
解决Firebase数据转指定数组格式的问题
我完全懂你的困扰——从Firebase Realtime Database拿数据时,得到的是带自定义唯一键的对象结构,但你需要的是那种索引连续的标准数组,对吧?
问题根源
Firebase在你用push()添加数据时,会自动生成一串唯一的字符串键(比如-Nxxxxxxxxx),所以data.val()返回的是一个键值对对象,而不是原生数组。你需要手动把这些键对应的对象提取出来,组装成你想要的数组格式。
修正后的代码
结合你给出的代码片段,我帮你调整成能输出目标数组的版本:
function gotData(data) { var mesta = data.val(); var keys = Object.keys(mesta); // 初始化空数组来存放最终格式的数据 var mestaArray = []; for (var i = 0; i < keys.length; i++) { var k = keys[i]; // 提取每个节点的内容,可选择保留Firebase的唯一键(按需取舍) var mestoItem = { id: k, // 如果你需要后续操作时用到这个Firebase键,就保留它 nazev: mesta[k].nazev, // 替换成你实际的字段名,比如名称、地址等 // 这里添加其他你需要的字段,比如: // adresa: mesta[k].adresa, // latitude: mesta[k].lat, // longitude: mesta[k].lng }; // 将组装好的对象推入数组 mestaArray.push(mestoItem); } console.log(mestaArray); // 现在这个就是你想要的数组格式了! }
简化版(不需要保留Firebase键的情况)
如果你的业务逻辑不需要用到Firebase生成的唯一键,直接把节点对象推入数组即可:
function gotData(data) { var mesta = data.val(); var keys = Object.keys(mesta); var mestaArray = []; for (var i = 0; i < keys.length; i++) { // 直接把每个节点的完整对象推入数组 mestaArray.push(mesta[keys[i]]); } console.log(mestaArray); }
额外说明
如果你之前是用数字索引作为Firebase的键(比如0、1、2...),Firebase可能会返回数组,但这种方式不推荐——一旦删除中间元素,索引会出现断层,后续操作很容易出问题。官方更推荐用push()生成的唯一键,再手动转数组,这也是更健壮的做法。
内容的提问来源于stack exchange,提问作者Tadeas Hort
相关产品推荐
相关产品推荐

