JavaScript中对象含元素但Obj.length返回undefined且无法遍历问题
问题根源
你遇到的核心问题是异步操作的执行时机:get()是异步Promise方法,你的循环只是发起了请求,但没等所有请求的回调完成就去打印/返回对象,此时对象还是空的。控制台展开对象时会实时读取当前状态,所以能看到后续填充的数据,但代码里的同步操作(比如Object.keys(dict))是在空对象时执行的,自然无效。
解决方法
方案1:顺序等待异步请求(适合需要按顺序处理的场景)
用await等待每个get()请求完成,确保循环内的异步操作执行完毕后再处理对象:
async function dictGenerator(rollnos, selectedValue) { const dict = {}; // 用for...of循环配合await,确保每个请求完成后再进行下一个 for (const rollno of rollnos) { const snapshot = await get(child(dbref, `RegisterNos/${rollno}`)); const val = snapshot.val(); // 你的判断逻辑 if (Object.keys(val).length - 1 === selectedValue) { dict[rollno] = val.name; } } // 现在对象已填充完成,可正常操作 console.log(dict); console.log(Object.keys(dict).length); // 获取对象键的数量(对象没有length属性) // 遍历对象示例1:用Object.entries获取键值对 for (const [rollno, name] of Object.entries(dict)) { console.log(`学号:${rollno},姓名:${name}`); } // 遍历对象示例2:用Object.keys遍历键 Object.keys(dict).forEach(rollno => { console.log(`学号:${rollno},姓名:${dict[rollno]}`); }); return dict; } // 调用方式 dictGenerator(你的学号数组, 选中值) .then(dict => { // 后续业务逻辑 }) .catch(err => { console.error('数据获取失败:', err); });
方案2:并行处理异步请求(效率更高,适合无顺序要求的场景)
用Promise.all同时发起所有请求,等待全部完成后构建对象:
async function dictGenerator(rollnos, selectedValue) { // 生成所有请求的Promise数组 const requestPromises = rollnos.map(async rollno => { const snapshot = await get(child(dbref, `RegisterNos/${rollno}`)); const val = snapshot.val(); if (Object.keys(val).length - 1 === selectedValue) { return [rollno, val.name]; // 返回符合条件的键值对 } return null; // 不符合条件的返回null }); // 等待所有请求完成 const results = await Promise.all(requestPromises); // 过滤无效结果,构建最终对象 const dict = {}; results.forEach(result => { if (result) { const [rollno, name] = result; dict[rollno] = name; } }); // 操作对象 console.log(dict); console.log(Object.keys(dict).length); return dict; }
关键注意点
- 异步操作必须等待:所有依赖异步结果的代码,必须放在
await之后或Promise.all的回调里。 - 对象没有length属性:获取对象的键数量要用
Object.keys(对象).length,而非对象.length。 - 遍历对象的常用方法:
Object.entries(对象):返回键值对数组,适合同时获取键和值。Object.keys(对象):返回所有键的数组,适合遍历键。Object.values(对象):返回所有值的数组,适合遍历值。
内容的提问来源于stack exchange,提问作者ichbinjay
相关产品推荐
相关产品推荐

