提问人:Jeff 提问时间:2/24/2015 最后编辑:Marc BJeff 更新时间:2/24/2015 访问量:326
JavaScript 变量变量
JavaScript variable variables
问:
说我有对象:
function obj()
{
this.prop1;
this.prop2;
this.prop3;
}
和一系列 OBJ
objects = [new obj(),new obj(),new obj()];
我想使用 jquery 轻松遍历每个类名,其中类名等同于对象的属性。
var itemsIWantToBind = ["prop1","prop2","prop3"];
for(j=0;j<itemsIWantToBind.length;j++)
{
$("."+itemsIWantToBind[j]).unbind().blur(function(){
var id = $(this).siblings(".objID").html();
if(id >= 0)
{
objects[id].itemsIWantToBind[j] = $(this).text());
}
});
}
我的问题是我希望能够使用变量变量来遍历为此的项目
objects[id].itemsIWantToBind[j] = $(this).text());
^^^^^^^^^^^^^^^^^
指示的部分未正确绑定数组项的值,因为它正在尝试绑定数组项的属性名称。
在 php 中,它与以下内容相同:
foreach($itemsIwantToBind as $item)
{
$objects[$id]->$item = "Something";
}
在 JavaScript 中有一种简单的方法可以做到这一点吗?
答:
3赞
T.J. Crowder
2/24/2015
#1
使用括号表示法:
var o = new obj();
o.prop1 = "I'm the value";
var s = "prop1";
console.log(o[s]); // "I'm the value"
我认为这就是与您的代码的关系:
["prop1","prop2","prop3"].forEach(function(prop) { // **A**
$("."+prop).unbind().blur(function(){
var id = $(this).siblings(".objID").html();
if(id >= 0)
{
objects[id][prop] = $(this).text()); // **B**
}
});
});
(B) 是我们实际使用名称的位置,但请注意 (A) 更改为,以便我们得到一个不会更改的值。你不能只使用
// Wrong unless we also change the loop
objects[id][itemsIWantToBind[j]] = $(this).text());
因为当事件发生时,将超出数组的末尾。j
forEach
是 ES5 的一项功能,可以很容易地为旧浏览器填充。或者你可以改用jQuery的:$.each
$.each(["prop1","prop2","prop3"], function(i, prop) { // **A**
$("."+prop).unbind().blur(function(){
var id = $(this).siblings(".objID").html();
if(id >= 0)
{
objects[id][prop] = $(this).text()); // **B**
}
});
});
评论
1赞
Jeff
2/24/2015
啊,我已经试过了,但我的问题是变量范围(这是正确的,我会尽可能接受)。我的数组 itemsIWantToBind 超出了我调用的 .blur() 方法的范围。感谢您的帮助!
0赞
T.J. Crowder
2/24/2015
@Jeff:这很奇怪,它不在问题中——但是,我猜这个问题是实际代码的一个相当精简的版本。:-)
1赞
Jeff
2/24/2015
@t-j-crowder 是的,我后来意识到了这一点。我无法从 blur 方法中调用 itemsIWantToBind 或 j,但您正确回答了我发布的问题;只是我的错误是其他地方,在我问这个之后才意识到!再次感谢您的帮助:)
0赞
T.J. Crowder
2/24/2015
@Jeff:大声笑——2009 年第 5 版规范最终确定时的“新”。:-)各种漂亮的阵列添加-- , , ...map
some
reduce
评论
something[propertyName]
objects[id][itemsIWantToBind[j]]
?j