使用push()和for循环的Javascript JSON数组问题

时间:2013-01-03 18:24:28

标签: javascript json node.js object for-loop

我做了一个简单的程序,使用两个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没有方法推送但是如果我刚刚插入了数字2,那么为什么数字2出现在[{'pname' : imagesdata[z].pname , 'pimage' : imagesdata[z].pimage}]

谢谢!

1 个答案:

答案 0 :(得分:3)

push()返回数组的长度,而不是添加了新元素的数组。

除非我误读你的代码:

  1. 在第一次迭代中,您正在进行== null检查,因此创建一个新数组。
  2. 在第二次迭代中,您在else子句中并向数组添加元素,然后将data属性设置为它的长度(2) 。
  3. 第三次次迭代中,Number没有push()方法。
  4. 但是,请注意,因为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 == null true就是=== undefined(通过类型强制)。更好的检查是array instanceof Array,或者更好,{{1}}