You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何for循环无法遍历JSON数组并填充下拉菜单?

解决fetch获取运动员名单后循环插入下拉菜单失效的问题

你的问题确实是混淆了数组和对象的概念——你现在的代码只拿到了单个运动员对象,而非整个运动员名单数组,导致循环无法执行。

问题根源

看这段代码:

const athletes = data.team.roster[0].athlete

data.team.roster是包含所有运动员条目的数组,你加了[0]就只取了数组里第一个元素,再.athlete拿到的是单个运动员的对象(比如{name: "John Doe", age:20})。单个对象没有length属性,所以for循环的条件i < athletes.length不成立,循环直接跳过。

修正后的代码

把代码改成下面这样,先拿到整个roster数组,再遍历每个元素取出athlete的name:

async function getAthletes() {
    const getPlayers = document.getElementById('getPlayers');
    
    try {
        const response = await fetch('athlete.json', { method: 'GET' });
        const data = await response.json();
        
        // 拿到整个运动员名单数组
        const roster = data.team.roster;
        // 先拼接所有option字符串,减少DOM操作次数
        let optionsHtml = '';
        for(let i = 0; i < roster.length; i++) {
            const athleteName = roster[i].athlete.name;
            optionsHtml += `<option value="${athleteName}">${athleteName}</option>`;
        }
        // 一次性插入到select中
        getPlayers.innerHTML += optionsHtml;
    } catch (error) {
        console.error('获取运动员数据失败:', error);
    }
}

额外优化说明

  1. 统一用async/await替代then链式调用,代码更易读,同时加入try/catch处理请求异常;
  2. 先把所有option字符串拼接完成再插入DOM,比每次innerHTML +=性能更好(减少DOM重绘次数);
  3. 直接从roster[i].athlete.name提取名称,逻辑更清晰。

修正后效果

执行后你的下拉菜单会生成期望的HTML结构:

<select id="getPlayers" data-category="Vote" data-action="click" data-label="Select Player">
    <option value="">Select player</option>
    <option value="John Doe">John Doe</option>
    <option value="Jane Doe">Jane Doe</option>
    <option value="Jack Doe">Jack Doe</option>
    <option value="Joe Doe">Joe Doe</option>
</select>

内容的提问来源于stack exchange,提问作者user22189133

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 11:49:58