假设您有一系列字符串,例如:
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会相应地更新,但它并不优雅。
我的问题:有更好的方法吗?也许类似于使用指针?
答案 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