使用push()和for循环的Javascript JSONArray问题

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

谢谢!

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

除非我错误地阅读你的代码:

  1. 在第一次迭代中,您正在击中== null检查,并创build一个新的数组。
  2. 在第二次迭代中,你在else子句中,向数组中添加一个元素,然后将data属性设置为length(2)。
  3. 第三次迭代中, Number没有push()方法。

但是,请注意,因为在初始化数组后, arrayvariables将是对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 (通过types强制转换)。 更好的检查将是=== undefined ,或更好, array instanceof Array