JavaScript中如何将Firebase返回的对象转换为指定格式数组?
解决Firebase返回对象转数组及代码错误修复
一、先搞定Firebase对象转目标数组的需求
你从Firebase拿到的是一个带数字索引键的类数组对象,要转换成你想要的标准数组其实很简单,给你几个实用方法:
方法1:用Object.values()直接转换(最推荐)
这是现代JS里最简洁的方式,它会直接提取对象的所有值,返回一个标准数组:
// 假设从Firebase获取的对象是firebaseObj const firebaseObj = { 0: {id: "1", name: "Fever"}, 1: {id: "2", name: "Cough"}, 2: {id: "3", name: "Headache"}, 3: {id: "4", name: "Stomach Pain"} }; const targetArray = Object.values(firebaseObj); console.log(targetArray); // 输出就是你要的目标数组:[{id: "1", name: "Fever"},{id: "2", name: "Cough"},{id: "3", name: "Headache"},{id: "4", name: "Stomach Pain"}]
方法2:兼容旧环境的写法
如果需要考虑旧浏览器兼容,可以结合Array.from()使用:
const targetArray = Array.from(Object.values(firebaseObj));
方法3:手动遍历索引(适合理解底层逻辑)
要是你想自己实现遍历逻辑,也可以这么写:
const targetArray = []; const keys = Object.keys(firebaseObj); // 获取所有数字索引键 keys.forEach(key => { targetArray.push(firebaseObj[key]); });
二、分析你之前代码返回空数组的原因
你写的那段代码逻辑是做重复项计数,但完全跑不通的问题出在这几个细节上:
- 属性名大小写不匹配:原数据里的属性是小写的
name,但你代码里用了大写的Name,自然找不到匹配项; - 原数据没有
Value属性:你代码里尝试取item.Value,但你的Firebase数据里只有id和name,这会导致Value是undefined; - 需求完全不匹配:你本来是要转数组,但这段代码是用来统计重复元素的逻辑,和你的目标根本不搭边。
如果之后你确实需要做重复项计数(比如数据里有重复的name),修正后的代码应该是这样:
// 假设arr是已经转好的标准数组 const arr = [{id: "1", name: "Fever"}, {id: "2", name: "Cough"}, {id: "3", name: "Headache"}, {id: "4", name: "Stomach Pain"}]; let result = []; arr.forEach(item => { // 注意用和原数据一致的小写name let resObj = result.find(resObj => resObj.name === item.name); // 原数据没有Value,这里改成你实际需要的属性 resObj ? resObj.Count++ : result.push({name: item.name, id: item.id, Count: 1}); }); console.log(result);
内容的提问来源于stack exchange,提问作者vivek manavadariya
相关产品推荐
相关产品推荐

