Скажи, что у меня есть объект:
function obj()
{
this.prop1;
this.prop2;
this.prop3;
}
и массив объектов
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?
Используйте скобки
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’s $.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**
}
});
});
Других решений пока нет …