JavaScript循环初始化动态值时indexOf()方法失效问题
为什么你的循环里indexOf没生效?我来帮你搞定!
问题根源你得先明白
你现在写的("statusfield" + j).indexOf("Yes"),其实是在对变量名的字符串(比如"statusfield1")做查找,而不是去读statusfield1这个变量里的"Yes"值!字符串"statusfield1"里根本没有"Yes",所以这个判断永远返回-1,自然进不了if块啦。
两种靠谱的解决方案
方案1:用对象存状态(推荐,代码更规范)
把所有status相关的变量塞进一个对象里,这样就能通过动态生成的属性名来取值,逻辑清晰还好维护:
// 先把状态字段整理到对象里 const statusFields = { field1: "Yes", field2: "Yes", field3: "No", // 举个其他值的例子 field4: "Yes", field5: "No" }; for (let j = 1; j <= 5; j++) { // 动态获取对应字段的值 const currentStatus = statusFields[`field${j}`]; // 这里可以用includes更直观,不用indexOf判断>=0 if (currentStatus && currentStatus.includes("Yes")) { console.log(`statusfield${j}的值是Yes,进入判断啦!`); // 这里写你的业务逻辑 } }
方案2:访问全局变量(仅限变量是全局的情况)
如果你的statusfield1、statusfield2这些是全局变量(比如直接在script标签里定义的,挂载在window上),可以通过window[变量名字符串]来拿到变量的值:
var statusfield1 = "Yes"; var statusfield2 = "Yes"; var statusfield3 = "No"; var statusfield4 = "Yes"; var statusfield5 = "No"; for (let j = 1; j <= 5; j++) { // 动态获取全局变量的值 const currentStatus = window[`statusfield${j}`]; if (currentStatus && currentStatus.indexOf("Yes") >= 0) { console.log(`statusfield${j}的值是Yes,进入判断啦!`); } }
小提示优化代码
- 尽量用
let/const替代var,避免变量提升带来的奇怪问题; - 如果只是判断值是否是"Yes",直接用
currentStatus === "Yes"会更高效;如果是判断包含"Yes",用ES6的includes()比indexOf()可读性更强哦。
内容的提问来源于stack exchange,提问作者sam mathew
相关产品推荐
相关产品推荐

