如何将字符串作为变量名,动态访问对象属性避免switch分支?
动态访问对象属性解决冗余判断问题
看起来你是想用动态属性名来访问this上的weekly/monthly/quarterly数组,避免冗余的switch判断对吧?你的思路完全没问题,但代码里有几个关键错误,我帮你修正并解释清楚:
核心错误点分析
name变量赋值错误:你写的var name = newCheckbox.checked拿到的是布尔值(true/false),但你需要的是对应数组名称的字符串("weekly"/"monthly"/"quarterly"),应该取checkbox的name属性。indexOf参数错误:你写的indexOf('newCheckbox.value')是在数组里找字符串"newCheckbox.value",而非实际的newCheckbox.value变量值,这会导致永远找不到目标索引。- 动态属性访问方式错误:拼接字符串
'this.+'newCheckbox.checked的写法完全不符合JS语法,动态访问对象属性直接用方括号语法this[name]即可。
修正后的完整代码
checkboxSaveOnChange: function(newCheckbox){ // 拿到对应数组的名称(weekly/monthly/quarterly) var name = newCheckbox.name; // 缓存checkbox的值,避免重复读取 var value = newCheckbox.value; if (newCheckbox.checked) { // 动态访问对应数组,添加值 this[name].push(value); } else { // 找到值在数组中的索引 var index = this[name].indexOf(value); // 只有找到有效索引(不等于-1)时才执行删除,避免报错 if (index !== -1) { this[name].splice(index, 1); } } // 测试输出,确认数组变化 console.log(this.weekly); console.log(this.monthly); console.log(this.quarterly); },
额外注意事项
- 确保
this的上下文正确:如果这个方法是事件回调,可能需要提前绑定this(比如用箭头函数或者bind),否则this[name]可能找不到对应的数组。 - 提前初始化数组:要保证
this.weekly、this.monthly、this.quarterly都是已初始化的空数组(比如在类的构造函数里赋值this.weekly = []),否则执行push操作时会报错。
内容的提问来源于stack exchange,提问作者Imnotapotato
相关产品推荐
相关产品推荐

