如何利用数组元素生成switch语句中的case分支?
问题:如何从数组生成switch语句的case分支?
我有一段生成数组的代码:
pointObjects = []; for (var i = 0; i < 2; i++) { // Generate cases. var url; var pointObject = { case: 'Placeholder', url: 'google.com' } pointObjects.push(pointObject); }
数组元素示例(pointObjects[0]):
{ case: 'Placeholder', url: 'google.com' }
我想把这些数组元素转化为switch语句的case分支,最终效果如下:
click: function(event) { var seriesName = this.name; var url; // Attaches the query link to the respective slice. switch (seriesName) { case 'Placeholder': url = 'google.com'; break; case 'Placeholder': url = 'google.com'; break; default: url = '#'; } // Opens the query in a new tab if (url !== '#') { window.open(url, '_blank'); } }
我尝试了以下代码,但报错提示pointObjects是意外标识符:
switch (seriesName) { pointObjects.forEach(obj => { case obj.case: url = obj.url; break; }); default: url = '#'; }
请问如何正确实现这一需求?
解决方案
方案1:用对象映射替代switch(推荐)
switch属于静态语法结构,无法直接在内部通过循环生成case分支。更简洁高效的方式是把pointObjects转换成键值对对象,直接通过属性访问获取URL:
click: function(event) { var seriesName = this.name; // 将数组转换为键值对映射 const urlMap = pointObjects.reduce((map, item) => { map[item.case] = item.url; return map; }, {}); // 直接取值,默认返回'#' var url = urlMap[seriesName] || '#'; // 打开新标签页 if (url !== '#') { window.open(url, '_blank'); } }
这种方式代码更简洁,查找效率高于switch,尤其当数组元素数量较多时优势更明显。
方案2:动态生成switch代码(仅当必须用switch时)
如果业务场景要求必须使用switch语句,你需要提前动态拼接switch的case分支代码,再通过new Function或eval执行(注意:动态代码存在安全风险,需确保pointObjects的内容可信):
// 生成所有case分支的字符串 const caseSegments = pointObjects.map(item => ` case '${item.case}': url = '${item.url}'; break; `).join(''); // 动态生成click函数 const clickHandler = new Function(` return function(event) { var seriesName = this.name; var url; switch (seriesName) { ${caseSegments} default: url = '#'; } if (url !== '#') { window.open(url, '_blank'); } } `)(); // 将生成的函数绑定到目标位置,例如: // chartOptions.click = clickHandler;
内容的提问来源于stack exchange,提问作者throwaway2908457
相关产品推荐
相关产品推荐

