这个问题看起来有点像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"]
而不在函数参数中键入命名空间。
答案 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');
答案 2 :(得分:0)
使用:
color[arg[i]].push(obj);
color.arg
确实在arg
中寻找名为color
的媒体资源。相反,您希望它使用arg
中的名称引用属性,这是括号表示法的用法。
因此,例如,如果arg == ["red", "green", "blue"]
,则color[arg[2]]
将指向与color.blue
相同的属性。