javascript push一个对象遇到的问题。

来源:互联网 发布:第一会所会员账号 淘宝 编辑:程序博客网 时间:2024/05/20 21:48

在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对象使用的问题。看来基本功不扎实啊!委屈


0 0