如何将GitHub API获取的对象数组转换为JavaScript Map数组?
解决方案
问题根源
fetchData是异步函数,调用后返回的是 Promise 对象,不是直接的数组,无法直接通过data[i]访问元素。- 原
fetchData函数内部没有返回fetch的 Promise 链,导致最终拿到的 Promise 结果是undefined。 - 直接用对象作为 Map 的键(
map1.set(data[i], data[i].contributions))属于引用类型,后续查询不便,建议用贡献者的唯一标识(比如login字段)作为键。
修正后的代码
async function fetchData() { const token = '<GitHub Token>'; // 返回 fetch 的 Promise 链,让外部能拿到数据 return fetch('https://api.github.com/repos/Bitwarden/mobile/contributors', { headers: { 'Authorization': `token ${token}` // GitHub Token 格式需加前缀 token } }) .then(response => { if (!response.ok) { throw new Error(`请求失败: ${response.status}`); } return response.json(); }) .catch(error => { console.error('获取数据出错:', error); throw error; // 抛出错误让外部处理 }); } // 用 async/await 等待异步数据返回 async function processData() { try { const contributors = await fetchData(); // 转换为 Map:以贡献者 login 为键,贡献数为值 const contributionsMap = new Map( contributors.map(contributor => [contributor.login, contributor.contributions]) ); // 若坚持用整个对象作为键(不推荐,对象是引用类型) // const contributionsMap = new Map( // contributors.map(contributor => [contributor, contributor.contributions]) // ); console.log(contributionsMap); // 示例:获取指定贡献者的贡献数 console.log('bitwarden-cli 的贡献数:', contributionsMap.get('bitwarden-cli')); } catch (error) { console.error('处理数据出错:', error); } } // 执行处理函数 processData();
关键说明
- 异步函数必须用
await或.then()获取最终结果,不能直接赋值操作。 - 用
Array.map()将对象数组转换为 Map 所需的键值对数组,直接传入new Map()即可完成转换,比手动循环更简洁。
内容的提问来源于stack exchange,提问作者Chitin
相关产品推荐
相关产品推荐

