You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过变量名拼接变量值的方式声明变量并动态引用对应数组?

解答你的两个问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:29:04