2

次のような文字列の配列があるとします。

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

オブジェクトで満たされる空の配列。それぞれのオブジェクトには、果物配列の特定のインデックスにバインドされたテキスト プロパティがあります。

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 内のオブジェクトのテキスト プロパティが、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
});

2 番目の方法を使用すると、fruit[] を変更でき、それに応じて objlist が更新されますが、エレガントではありません。

私の質問:これを行うためのより良い方法はありますか? ポインタの使用に似たものでしょうか?

4

1 に答える 1

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
于 2012-10-18T23:56:23.990 に答える