使用传递的变量名作为另一个变量名的一部分

时间:2018-07-07 18:11:36

标签: javascript arrays node.js

blah('A');

function blah(letter){
arrayA.push('something');
}

我想将某些内容推送到一个数组,该数组的名称为'array'加上要传递给它的字母。

我可以很好地解决“ arrayA”问题:     console.log('array'+ ${letter}

但是,如果我尝试构建数组名称,则相同的逻辑将不起作用:     数组${letter}。push('something')

2 个答案:

答案 0 :(得分:0)

在浏览器中(全局对象,函数和变量成为窗口对象的成员),您可以使用方括号表示法创建和访问动态命名的对象。 您在寻找这样的东西吗?

function blah(letter){
    window['array' + letter] = [];
    window['array' + letter].push('something');
}

blah('A');

此后,您可以照常访问和使用新创建的数组(arrayA)。

arrayA.push('something else');

在节点中,您可以使用global而不是window来实现。

答案 1 :(得分:0)

尝试一下,然后忘记它(或将3次出现的window替换为global,以进行node.js的测试)

function test(name,value){
  if(!window["array"+name])
    window["array"+name]=[];
  window["array"+name].push(value);
}

try{console.log(arrayA);}catch(e){console.log("arrayA missing: "+e);}
test("A",10);
try{console.log(arrayA);}catch(e){console.log("arrayA missing: "+e);}
test("A",20);
try{console.log(arrayA);}catch(e){console.log("arrayA missing: "+e);}

window是浏览器中的全局作用域,通常,您没有充分的理由不应该依赖全局变量。他们缺乏背景(这就是为什么它们是“全球性”的),使得很难说出它们属于什么,它们是什么以及它们来自何处。大多数编程范例都建议这样做。

这也可以在node.js中使用,只是它具有global作为全局上下文,您可以将此代码段粘贴到https://www.tutorialspoint.com/execute_nodejs_online.php中作为测试,替换3个window-s,它将起作用(当然,您也可以将其包装到适当的模块中,这只是更多工作)。上面针对全局变量的用法所写的内容对于node.js仍然适用。不要使用全局上下文,尤其是在开发模块时。

但是,该语法也可以代替任何对象使用window,并且认为可以:

var obj={};
console.log(obj.something);
obj['some'+'thing']=10;
console.log(obj.something);

因此,您可以自由地拥有自己的“上下文”对象(如果您在模块的顶层编写var obj={};行,则该代码将在该模块的任何位置可用,并且不会干扰外部),并使用这种类似于数组的语法(obj['something']创建/访问其成员,并在需要时动态构建名称。