如何通过for循环的索引绑定到数组元素?

时间:2012-09-19 07:42:56

标签: javascript

假设您有一系列字符串,例如:

var fruit = ["apple","peach","pear","plum"];

和一个要填充对象的空数组,每个对象都有一个绑定到fruit数组的特定索引的text属性:

var objlist = [];

for (var i=0;i<fruit.length;i++) {
    objlist.push({text: fruit[i]});
}

//objlist[0].text = "apple", objlist[1].text = "peach", etc.

有没有办法“绑定”第一个数组的元素,所以请注意以下语句:

fruit.shift()

会导致objlist中对象的text属性更新为fruit数组中的相应索引吗?

//objlist[0].text = "peach", objlist[1].text = "pear", etc.

我已经接受了这样一个事实:.text可能必须是一个函数.text(),但这对我的目的来说没问题。

以下原因不明显:

for (var i=0;i<fruit.length;i++) {
    objlist.push({text: function() { return fruit[i]; }});  //i is not bound
}

然而,这完美地运作:

[0,1,2,3].forEach(function(i) {
    objlist.push({text: function() { return fruit[i]; }});  //i is bound
});

使用第二种方法我可以修改fruit [],objlist会相应地更新,但它并不优雅。

我的问题:有更好的方法吗?也许类似于使用指针?

1 个答案:

答案 0 :(得分:1)

没有必要创建其他数组,因为您可以通过for-in构造进行绑定。喜欢这个

for (var k in fruit) {
    objlist.push({text: function() { return fruit[k]; }});
}

所以,使用您的测试用例

var fruit = ["apple","peach","pear","plum"];
var objlist = [];

for (var k in fruit) {
    objlist.push({text: function() { return fruit[k]; }});
}

console.log('---- init state -----')
for(k in objlist) {
    console.log(objlist[k].text());
}

fruit.shift();
console.log('---- shifted state -----')
for(k in objlist) {
    console.log(objlist[k].text());
}

代码获取

---- init state -----
apple
peach
pear
plum
---- shifted state -----
peach
pear
plum
undefined