2015-02-23 135 views
1

说我有对象:JavaScript变量变量

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中做到这一点?

+0

是,使用方括号:'东西将[PropertyName]'' – georg 2015-02-23 19:02:24

+0

对象[ID] [itemsIWantToBind [J]'? – 2015-02-23 19:04:53

+0

参见http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – georg 2015-02-23 19:11:18

回答

2

使用方括号表示法:

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

阿连工作,我不得不试过,但我的问题是变量的范围(这是正确的,我会尽可能接受)。我的数组itemsIWantToBind超出了我调用的.blur()方法的范围。谢谢您的帮助! – Jeff 2015-02-23 19:06:57

+0

@Jeff:这很奇怪,它不在问题中 - 但是,我猜这个问题是一个相当精简的实际代码版本。 :-) – 2015-02-23 19:08:01

+1

@ t-j-crowder是的,我意识到这一点后。我无法在blur方法中调用itemsIWantToBind或j,但您正确回答了我发布的问题;只是我的错误是其他地方,并在我问这个问题后意识到了!再次感谢您的帮助:) – Jeff 2015-02-23 19:10:43