对象索引0为数组,调用map函数返回undefined,如何正确访问?
问题分析与解决方案
你的代码存在几个核心问题,直接导致obj[0]返回undefined:
- 异步逻辑处理错误
- 你给
Promise.all传入的result是普通对象数组,而非Promise数组,Promise.all会直接将这个数组作为resolved结果。但你往空数组promises里push结果的操作是异步执行的,函数却直接返回了空的promises数组——此时异步操作还没触发,obj拿到的自然是空数组,obj[0]也就成了undefined。
- 你给
- 返回值逻辑完全错误
- 你的目标是返回处理后的
result数组,但当前代码错误地返回了一个始终为空的数组,根本没拿到实际数据。
- 你的目标是返回处理后的
修复后的代码(分两种场景)
场景1:无异步操作(当前代码逻辑无异步需求)
直接返回处理完成的数组即可:
function getRowData() { let translationByLang = Object.values(translationArray.reduce((acc, {field, lang, text}) => { acc[lang] = acc[lang] || { lang }; acc[lang][field] = text; return acc; }, {})); let result = translationByLang; if (result.length < 2) { let obj = {"lang": "en", "name": "Documento mancante", "pdf_url": ""}; result.push(obj); } // 直接返回处理好的数组 return result; } const obj = getRowData(); console.log('typeof', typeof obj, ', obj', obj); // 现在可正常调用map obj.map(item => { console.log(item.lang, item.name); });
场景2:存在异步操作(比如result元素是Promise)
如果translationArray相关逻辑包含异步操作,或需要处理Promise数组,应返回Promise对象而非空数组:
function getRowData() { let translationByLang = Object.values(translationArray.reduce((acc, {field, lang, text}) => { acc[lang] = acc[lang] || { lang }; acc[lang][field] = text; return acc; }, {})); let result = translationByLang; if (result.length < 2) { let obj = {"lang": "en", "name": "Documento mancante", "pdf_url": ""}; result.push(obj); } // 返回Promise.all处理后的Promise对象 return Promise.all(result); } // 通过then或async/await获取结果后再操作 getRowData().then(obj => { console.log('typeof', typeof obj, ', obj', obj); obj.map(item => { console.log(item.lang, item.name); }); });
关键总结
- 同步逻辑里不要错误混用异步操作,避免返回空数组;
- 无异步需求时,直接返回处理完成的数组;
- 有异步需求时,返回Promise对象,在异步完成后再调用
map等数组方法。
内容的提问来源于stack exchange,提问作者beginnerspirit
相关产品推荐
相关产品推荐

