如何通过变量名拼接变量值的方式声明变量并动态引用对应数组?
解答你的两个问题
1. 关于通过变量名+值拼接声明/引用变量的方法
首先,不推荐直接通过拼接字符串的方式来声明或引用变量——这种写法会让代码可读性变差、难以维护,还容易引发作用域相关的问题。但如果确实有需求要实现,分两种场景:
- 如果变量是全局作用域的(比如浏览器环境下挂载在
window上),可以通过window[变量名字符串]来访问,比如window[orderObj${a+1}]; - 如果是局部作用域的变量,虽然可以用
eval()来实现(比如eval(orderObj${a})),但eval存在安全风险且性能不佳,非常不建议使用。
更规范的做法是把相似的变量统一放到数组或对象中,通过索引或键来访问,这也是我接下来要推荐给你的方案。
2. 实现ordName依次指向orderObj1~orderObj6的需求
先看你现有代码的问题:var ordName = orderObj + a;这行代码只是把字符串"orderObj"和a的值拼接成了一个字符串(比如a=0时是"orderObj0"),并没有指向对应的数组变量,所以自然无法执行push操作。另外,a + 1;这行是无效的,因为没有把运算结果赋值给a,必须写成a++或a += 1才能改变a的值。
方案1:不修改现有变量声明(不推荐)
如果你不想改动已经声明的orderObj1到orderObj6,可以通过window访问全局变量的方式实现:
let a = 0; for (let [key, value] of Object.entries(req.user.orders[z])) { if (key === orderName[a] + "Name") { // 先递增a,因为初始a=0要指向orderObj1 a++; // 拼接变量名字符串,通过window访问对应的数组 const ordName = window[`orderObj${a}`]; ordName.push(value); } }
⚠️ 注意:如果这些变量是在局部作用域(比如函数内部),window就无法访问到了,这种场景下不建议继续用单独变量的方式,改用下面的方案2。
方案2:推荐的优化方式——用数组统一管理
把原来的6个单独数组变量换成一个大数组,直接通过索引访问,代码更简洁易维护:
// 替换原来的6个单独变量为一个数组,orderObjs[0]对应原来的orderObj1,以此类推 const orderObjs = [[], [], [], [], [], []]; let a = 0; for (let [key, value] of Object.entries(req.user.orders[z])) { if (key === orderName[a] + "Name") { // 直接通过索引a获取对应的数组 const ordName = orderObjs[a]; ordName.push(value); // 递增a,下一次循环指向下一个数组 a++; } }
这种方式不仅避免了拼接变量名的麻烦,还让代码结构更清晰,后续如果要增加更多类似的数组,直接在orderObjs里添加即可,不需要声明新的变量。
内容的提问来源于stack exchange,提问作者Wild-tuna
相关产品推荐
相关产品推荐

