JavaScript 变量变量

JavaScript variable variables

提问人:Jeff 提问时间:2/24/2015 最后编辑:Marc BJeff 更新时间:2/24/2015 访问量:326

问:

说我有对象:

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 中有一种简单的方法可以做到这一点吗?

JavaScript PHP jQuery 变量

评论

0赞 georg 2/24/2015
是的,使用方括号:something[propertyName]
0赞 Marc B 2/24/2015
objects[id][itemsIWantToBind[j]]?
0赞 georg 2/24/2015
另请参阅 stackoverflow.com/questions/750486/...
0赞 T.J. Crowder 2/24/2015
@MarcB:这会让他接近,但在事件发生时将无效。j
0赞 Jeff 2/24/2015
注意:@T.J.Crowder 正确回答了答案,但问题是由于 itemsIwantToBind 和 j 超出了 blur 方法的范围,因此即使使用正确的表示法:),上面的代码也无法正常工作

答:

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 版规范最终确定时的“新”。:-)各种漂亮的阵列添加-- , , ...mapsomereduce