Javascript 用数字填充数组

Javascript 用数字填充数组,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有这样的情况: 有8个div块,ID为'rateN_wrapper',其中'N'是div的数量: <div id="rate1_wrapper"> <a href="#" id="0_1">...</a> <a href="#" id="0_2">...</a> <a href="#" id="0_3">...</a> </div> <div id="rate2_wrapper"

我有这样的情况: 有8个div块,ID为'rateN_wrapper',其中'N'是div的数量:

<div id="rate1_wrapper">
  <a href="#" id="0_1">...</a>
  <a href="#" id="0_2">...</a>
  <a href="#" id="0_3">...</a>
</div>

<div id="rate2_wrapper">
  <a href="#" id="1_1">...</a>
  <a href="#" id="1_2">...</a>
  <a href="#" id="1_3">...</a>
</div>

...

var ratings = new Array();
for (i=0; i < 8; i++)
{
    ratings[i] = -1; // Default is unrated

}

for (i=0; i < 8; i++)
{
    $('#rate' + i + '_wrapper a').click(function() {
        ratings[i] = parseInt( $(this).attr('id').split('_')[1] );
        console.debug(ratings);
    });
}

...
var评级=新数组();
对于(i=0;i<8;i++)
{
评级[i]=-1;//默认值未评级
}
对于(i=0;i<8;i++)
{
$(“#rate”+i+“_包装器a”)。单击(函数(){
评级[i]=parseInt($(this).attr('id').split('uu')[1]);
控制台调试(额定值);
});
}

我的工作是用点击链接的id(已解析)填充需要的数组。但它总是只更改数组(8)的最新元素。为什么?

因为您创建的函数正在关闭i变量。它在当前值处看到对i的引用,而不是创建函数时的值。for循环退出后,我将是8岁,因此所有匿名函数都将更新
评级[8]
。我认为这可能会解决这个问题:

for (i=0; i < 8; i++)
{
    var idx = i;
    $('#rate' + idx + '_wrapper a').click(function() {
        ratings[idx] = parseInt( $(this).attr('id').split('_')[1] );
        console.debug(ratings);
    });
}

因此,您将创建一个函数,该函数将创建一个具有正确索引的匿名函数。返回的匿名函数将在创建时看到
idx
的值。

这是由于for循环中的闭包造成的问题。您可以通过解析父id来查找id:

for (i=0; i < 8; i++)
{ 
  $('#rate' + i + '_wrapper a').click(function() {
    var parentId = $(this).parent('div').attr('id');
    var index = /\d/.exec(parentId);
    ratings[index] = parseInt( $(this).attr('id').split('_')[1] );
  });
}
(i=0;i<8;i++)的

{ 
$(“#rate”+i+“_包装器a”)。单击(函数(){
var parentId=$(this.parent('div').attr('id');
var index=/\d/.exec(parentId);
评级[索引]=parseInt($(this).attr('id').split('uu')[1]);
});
}

使用jquery也可以完全避免for循环。each()可能更清晰实际上,想想看,如果在匿名函数体中而不是外部循环体中声明var idx=i,第一个示例将有效…@jarrett我不能在这里使用each(),我没有对象的静态名称。使用每个对象不需要静态名称
for (i=0; i < 8; i++)
{ 
  $('#rate' + i + '_wrapper a').click(function() {
    var parentId = $(this).parent('div').attr('id');
    var index = /\d/.exec(parentId);
    ratings[index] = parseInt( $(this).attr('id').split('_')[1] );
  });
}