1

我制作了一个简单的程序来使用两个 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. 在第二次迭代中,您在else子句中并向数组添加一个元素,然后data属性设置为其长度 (2)。
  3. 第三次迭代中, aNumber没有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()如果密钥不存在则返回undefined,并且它恰好undefined == nulltrue(通过类型强制)。更好的检查将是=== undefined,或者更好,array instanceof Array

于 2013-01-03T18:33:19.463 回答