1

2 つの for ループを使用して配列をローカルに格納する簡単なプログラムを作成しましたが、奇妙なことが起こりました...

私のコードがあります:

var imagesdata = data[0];
var preferences = data[1];

for (var i = preferences.length - 1; i >= 0; i--) {
    (function(i){
        for (var z = imagesdata.length - 1; z >= 0; z--) {
            (function(i){
                if(imagesdata[z].cathegory == preferences[i].cathegory){
                    var array = $('body').data('data'+preferences[i].cathegory);
                    if(array == null){
                        alert('asefsef');
                        $('body').data('data'+preferences[i].cathegory, [{'pname' : imagesdata[z].pname , 'pimage' : imagesdata[z].pimage}]);
                    }else{
                        $('body').data('data'+preferences[i].cathegory, array.push({'pname' : imagesdata[z].pname , 'pimage' : imagesdata[z].pimage}));
                    }
                }
            })(i);
        };
    })(i);
};

オブジェクト 2 にはメソッド push がないと言われています[{'pname' : imagesdata[z].pname , 'pimage' : imagesdata[z].pimage}]

ありがとう!

4

1 に答える 1

3

push()新しい要素が追加された配列ではなく、配列の長さを返します。

私があなたのコードを読み間違えていない限り:

  1. 最初の繰り返しでは、== nullチェックを押しているので、新しい配列を作成しています。
  2. 2 番目の反復では、else句で要素を配列に追加します、プロパティをその長さに設定しdataます (2)。
  3. 3回目の反復では、 a にはメソッドNumberがありませんpush()

ただし、array変数は配列を初期化すると配列への参照になるため、変数に加えたすべての変更は自動的dataにプロパティに反映されることに注意してください。push()そのため、新しいデータを作成するときに変更を書き戻す必要はありません。

if (array == null) {
    alert('asefsef');
    $('body').data('data' + preferences[i].cathegory, [{
        'pname': imagesdata[z].pname,
        'pimage': imagesdata[z].pimage}]);
} else {
    array.push({
        'pname': imagesdata[z].pname,
        'pimage': imagesdata[z].pimage
    });
}​

参考までに、あなたは== null運が良かっただけかもしれません。キーが存在しない場合にdata()返されますが、それは(型強制によって) 起こります。より良いチェックは、またはさらに良いでしょう、undefinedundefined == nulltrue=== undefinedarray instanceof Array

于 2013-01-03T18:33:19.463 に答える