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

JS级联下拉框显示选项索引而非对应值的代码修复方法

级联下拉框第二级显示索引序号修复方案

问题现象

两级select组成的级联下拉组件,选中第一个下拉框的Ariston选项时,预期第二个下拉框展示a、b、c、d对应选项,实际运行时第二个下拉框显示0、1、2、3的索引序号,异常效果如下:
级联下拉显示索引异常截图

问题复现代码

HTML部分

<select id="brand"></select>
<select id="model"></select>

JS部分

var brandObject = {
  'Ariston': ["a","b","c","d"],
  'Airpop': ["a","b"],
}

window.onload = function() {
  var brandSel = document.getElementById("brand");
  var modelSel = document.getElementById("model");

  for (var x in brandObject) {
    brandSel.options[brandSel.options.length] = new Option(x, x);
  }

  brandSel.onchange = function() {
    modelSel.length = 1;  // 清空第二个下拉框

    for (var y in brandObject[this.value]) {
      modelSel.options[modelSel.options.length] = new Option(y,y);   
    }
  }    
}

错误原因

for...in语法设计用来遍历对象的可枚举属性,遍历数组时返回的是字符串类型的数组下标(即"0"、"1"、"2"、"3"),而非数组存储的实际元素值。原代码遍历型号数组时,直接将遍历拿到的下标作为Option的显示文本和值传入,直接导致第二个下拉框只显示索引序号。

修复方法

将遍历型号数组的for...in替换为for...of,直接获取数组元素值即可,修正后的onchange逻辑如下:

brandSel.onchange = function() {
  modelSel.length = 1;  // 清空第二个下拉框
  // 用for...of直接遍历拿到数组元素
  for (var y of brandObject[this.value]) {
    modelSel.options[modelSel.options.length] = new Option(y, y);   
  }
}

如果需要兼容不支持for...of的老旧环境,也可以保留for...in写法,通过下标取到对应数组元素:

brandSel.onchange = function() {
  modelSel.length = 1;
  var modelList = brandObject[this.value];
  for (var y in modelList) {
    // 通过索引取到真实选项值
    modelSel.options[modelSel.options.length] = new Option(modelList[y], modelList[y]);   
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:21:37