javascript push一个对象遇到的问题。
2017-01-05 10:28
274 查看
在appcan中使用js数组 push一个对象遇到的问题
错误的使用如下:
var listData = [];
if(data){
var tmp = {"title":"","pagename":"","area_id":"","isOver":""};
for (var i=0; i < data.length; i++) {
tmp.title = "<div class='ub'><div class='ub ub-f1'>"+data[i]['area_name']+"</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>";
tmp.pagename = data[i]['area_name'];
tmp.area_id = data[i]['city_id'];
tmp.isOver = data[i]['isleaf'];
listData.push(tmp);
};
}else{
listData = [{'title':"<div class='ub'><div class='ub ub-f1'>无数据</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>",'pagename':'无','area_id':'0'}]
}
当你console.log(listData)时,你会发现listData里的数组元素都是最后一个对象。因为tmp声明在for循环之外,当listData数组push这个tmp对象时,一直是同一个对象,而并不是将对象的数据压入,只是在listData数组建立了一个对象的引用关系。故随着for的i值改变,tmp对象内部的内容也跟着改变,而listData压入的对象却始终是tmp这个对象(tmp生命周期不受for循环影响)。所以最终console.log(listData)出来的对象数组里面的元素都是一样的数据。简言之:就是tmp对象的数据再变,但是listData压入的tmp却是不变的。
正确的使用如下:
var listData = [];
if(data){
for (var i=0; i < data.length; i++) {
var tmp = {"title":"","pagename":"","area_id":"","isOver":""};
tmp.title = "<div class='ub'><div class='ub ub-f1'>"+data[i]['area_name']+"</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>";
tmp.pagename = data[i]['area_name'];
tmp.area_id = data[i]['city_id'];
tmp.isOver = data[i]['isleaf'];
listData.push(tmp);
};
}else{
listData = [{'title':"<div class='ub'><div class='ub ub-f1'>无数据</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>",'pagename':'无','area_id':'0'}]
}
当把tmp对象的声明放在for循环内时,tmp对象的生命周期是受for循环影响的,每循环一次,tmp就会释放再重新生成。故for中的tmp在循环中都是不用的对象,因此压入到listData中就是不同的数据。简言之就是:tmp对象数据在变,listData压入的tmp也在变。
当时打印数据是,看到数据一样时,有点找不到北,后来仔细分析,才发现是tmp对象使用的问题。看来基本功不扎实啊!
错误的使用如下:
var listData = [];
if(data){
var tmp = {"title":"","pagename":"","area_id":"","isOver":""};
for (var i=0; i < data.length; i++) {
tmp.title = "<div class='ub'><div class='ub ub-f1'>"+data[i]['area_name']+"</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>";
tmp.pagename = data[i]['area_name'];
tmp.area_id = data[i]['city_id'];
tmp.isOver = data[i]['isleaf'];
listData.push(tmp);
};
}else{
listData = [{'title':"<div class='ub'><div class='ub ub-f1'>无数据</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>",'pagename':'无','area_id':'0'}]
}
当你console.log(listData)时,你会发现listData里的数组元素都是最后一个对象。因为tmp声明在for循环之外,当listData数组push这个tmp对象时,一直是同一个对象,而并不是将对象的数据压入,只是在listData数组建立了一个对象的引用关系。故随着for的i值改变,tmp对象内部的内容也跟着改变,而listData压入的对象却始终是tmp这个对象(tmp生命周期不受for循环影响)。所以最终console.log(listData)出来的对象数组里面的元素都是一样的数据。简言之:就是tmp对象的数据再变,但是listData压入的tmp却是不变的。
正确的使用如下:
var listData = [];
if(data){
for (var i=0; i < data.length; i++) {
var tmp = {"title":"","pagename":"","area_id":"","isOver":""};
tmp.title = "<div class='ub'><div class='ub ub-f1'>"+data[i]['area_name']+"</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>";
tmp.pagename = data[i]['area_name'];
tmp.area_id = data[i]['city_id'];
tmp.isOver = data[i]['isleaf'];
listData.push(tmp);
};
}else{
listData = [{'title':"<div class='ub'><div class='ub ub-f1'>无数据</div><div class='ub'><div class='ub-img setup-icon0 umw2 umh1'></div></div></div>",'pagename':'无','area_id':'0'}]
}
当把tmp对象的声明放在for循环内时,tmp对象的生命周期是受for循环影响的,每循环一次,tmp就会释放再重新生成。故for中的tmp在循环中都是不用的对象,因此压入到listData中就是不同的数据。简言之就是:tmp对象数据在变,listData压入的tmp也在变。
当时打印数据是,看到数据一样时,有点找不到北,后来仔细分析,才发现是tmp对象使用的问题。看来基本功不扎实啊!
相关文章推荐
- struts2 自动装配对象时遇到只有一个属性被装配的问题
- 在tp3.2.3中使用 FormData 对象实现表单的文件上传功能遇到的一个问题及解决方法
- 关于hibernate用save方法保存对象所遇到的一个问题
- json字符转转对象时遇到的一个奇葩问题
- 今天遇到一个关于对象和对象方法内存分配的有趣的问题
- 这是我学习COM遇到的几个基本问题其解决 黄森堂(vcmfc)著 1.我用ATL生成一个组件对象,我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 答:IDD_IEncry
- unity lua C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释放掉这个对象;lua 那边会报错;遇到这种问题的解决方案
- java通过xstream将xml转换为java对象遇到的问题(一个对像中两个子类的类名相同)
- DTO的理解以及spring遇到的一个问题注解方式对象为空
- 遇到一个面向对象无法解决的问题。
- [导入]ASP.NET 2.0 的内部变化+金山词霸遇到的一个问题
- 在IIS 6 中使用HTTP压缩(Compression)遇到的一个问题
- 今天遇到的一个奇怪的vb.net问题
- 使用css expression遇到的一个问题
- 遇到一个郁闷问题,最后在郁闷中解决!
- 编VC网络程序遇到一个问题,原来是少了一个LIB。
- 刚刚遇到了一个棘手的电脑问题,好险!
- 练习Eclipse RCP遇到的一个问题及思考
- ASP.Net中下载文件遇到了一个问题--对话框弹出两次
- 遇到一个问题“安装程序没有访问目录C:\Inetpub\wwwroot的权限”