AJAX嵌套循环中如何匹配值并选中对应Option?
解决嵌套循环中匹配选项设为选中状态的问题
看起来你是想遍历两组数据,把data.com里每个项对应的select_id和data.api里的id做匹配,然后把匹配的下拉选项设为选中状态对吧?我看你贴的代码片段有几个小问题,帮你修正一下:
原代码的几个问题
- 字符串拼接时没有正确插入变量值:比如
<input type='hidden' value='data.com[i].id'/>这里,value会被当成字符串"data.com[i].id",而不是实际的id值 - 下拉选项的
value属性是空的,这样提交表单时拿不到有效数据 - 代码片段有语法不完整的地方(比如
</option&...)
修正后的代码(推荐用ES6模板字符串,更易读)
let h = ''; // 先初始化拼接用的字符串变量 for(let i = 0; i < data.com.length; i++){ const currentItem = data.com[i]; const targetId = currentItem.select_id; if(currentItem.dummy != null){ // 拼接表格和隐藏输入框 h += ` <table> <tr> <td><input type='hidden' value='${currentItem.id}'/></td> <td> <select> `; // 遍历api数据生成下拉选项 for(let j = 0; j < data.api.length; j++){ const apiItem = data.api[j]; // 判断当前选项是否需要选中 const isSelected = apiItem.id === targetId; // 拼接选项,注意加上value和显示文本(这里假设用name,你可以换成实际字段) h += ` <option value='${apiItem.id}' ${isSelected ? 'selected' : ''}> ${apiItem.name || apiItem.id} </option> `; } // 闭合标签 h += ` </select> </td> </tr> </table> `; } }
关键点说明
- 用
let/const代替var:避免变量提升导致的意外问题,代码逻辑更清晰 - 缓存循环当前项:把
data.com[i]和data.api[j]存成变量,减少重复数组访问,代码更简洁 - 模板字符串拼接:用
`包裹HTML,变量用${}插入,不用再反复拼接引号和加号,可读性拉满 - 严格相等判断:用
===代替==,避免隐式类型转换带来的匹配错误 - 完整的选项属性:给
option加上value和显示文本,确保下拉框能正常显示和提交数据
兼容旧环境的版本(不用模板字符串)
如果你的项目需要兼容不支持ES6的环境,可以用传统的字符串拼接方式:
var h = ''; for(var i = 0; i < data.com.length; i++){ var currentItem = data.com[i]; var targetId = currentItem.select_id; if(currentItem.dummy != null){ h += "<table><tr><td><input type='hidden' value='" + currentItem.id + "'/></td><td><select>"; for(var j = 0; j < data.api.length; j++){ var apiItem = data.api[j]; var selectedAttr = (apiItem.id === targetId) ? 'selected="selected"' : ''; h += '<option ' + selectedAttr + ' value="' + apiItem.id + '">' + (apiItem.name || apiItem.id) + '</option>'; } h += "</select></td></tr></table>"; } }
最后提醒一下:要确保data.com[i].select_id和data.api[j].id的类型一致(比如都是数字或者都是字符串),不然可能会出现匹配不上的情况哦~
内容的提问来源于stack exchange,提问作者Suryanand Premkumar
相关产品推荐
相关产品推荐

