使用JavaScript中的参数更改函数内的命名空间数组名称

时间:2014-06-16 08:14:22

标签: javascript function namespaces

这个问题看起来有点像this one,但它没有解决我的问题。

我有一个名为color.blue的对象的命名空间数组(color是命名空间,blue是对象数组),我需要做这样的事情:

var color = {
    red:[],
    blue:[]
}

function foo(arg){
    for(var i = 0; i < arg.length; i++){
        color.arg[i].push(obj);
    }
}

因此,我可以通过调用此函数将obj对象添加到对象的命名空间数组中,但此代码会抛出错误[Error] TypeError: undefined is not an object (evaluating 'color.arg[i]')。我甚至尝试使用eval()(成功),但我想避免慢/恶的代码。 有人可以帮助我吗?

请注意,我不想在函数的参数中编写命名空间,只是“红色”或“蓝色”

Here's a JSFiddle。我想添加console.log来打印["abc"]而不在函数参数中键入命名空间。

3 个答案:

答案 0 :(得分:1)

对象color没有名为arg的成员。而不是:

color.arg[i].push(obj)

......你可能想要:

var colorName = arg[i];
color[colorName].push(obj);

答案 1 :(得分:1)

如果属性名称来自变量,则需要使用括号语法来选择它:

for (var i = 0; i < arg.length; i++) {
    if (color.hasOwnProperty(arg[i])) {
        color[arg[i]].push(obj);
    }
}

附加条件可防止您执行foo('orange');

时发生错误

更新

var color = {
    red: []
}, obj = "abc";

function addObjToArray(arr){
    color[arr].push(obj);
}
addObjToArray(red);

console.log(color.red);

在代码中,使用未初始化的变量addObjToArray()调用red;你需要使用字符串文字:

addObjToArray('red');

Demo

答案 2 :(得分:0)

使用:

color[arg[i]].push(obj);

color.arg确实在arg中寻找名为color的媒体资源。相反,您希望它使用arg中的名称引用属性,这是括号表示法的用法。

因此,例如,如果arg == ["red", "green", "blue"],则color[arg[2]]将指向与color.blue相同的属性。