论坛首页 Web前端技术论坛

JavaScript JSON 对象深拷贝方法(一例)

浏览 7087 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-14   最后修改:2010-07-19

其实深拷贝一个JS对象方法十分简单,只需要两部

1.首先将JS对象序列化为JSON格式

2.然后再将JSON转化为JS对象。

 

//任意一个复杂的JS对象

var obj = [1,23,4,{name:'名字',value:"数值"}];

 //将这个JS对象序列化为一个JSON字符串

var json = JSON.encode(obj)

 //将JSON字符串解析成一个新的JS对象

var newObj JSON.decode(json )

 序列化JSON的方法参照 http://relucent.iteye.com/admin/blogs/646016

 

 

 

 

如果使用的是ExtJs库,那就是

var obj = [1,23,4,{name:'名字',value:"数值"}]; var newObj = Ext.decode(Ext.encode(obj ));

 

 

   发表时间:2010-07-16  
整来整去,效率呢?
0 请登录后投票
   发表时间:2010-07-16  
呵呵, 这样也是有问题的. 最初我也这样做的, 但是对日期类型的数据就不行, 转来转去日期类型就变成字符串了, JSON 规范中没有对日期的定义确实是一件憾事.

最后只有自己重新写了一个深拷贝的功能.
0 请登录后投票
   发表时间:2010-07-19  
function clone(para){
        var rePara = null;
        var type = Object.prototype.toString.call(para);
        if(type.indexOf("Object") > -1){
            rePara = {};
            for(var key in para){
                if(para.hasOwnProperty(key)){
                    rePara[key] = clone(para[key]);
                }
            }
        }else if(type.indexOf("Array") > 0){
            rePara = [];
            for(var i=0;i<para.length;i++){
               rePara[rePara.length] =  clone(para[i]);
            }
        }else{
            rePara = para;
        }
        return rePara;
    }
这个也凑合,临时用用够了
0 请登录后投票
   发表时间:2010-07-19   最后修改:2010-07-19
glassprogrammer 写道
呵呵, 这样也是有问题的. 最初我也这样做的, 但是对日期类型的数据就不行, 转来转去日期类型就变成字符串了, JSON 规范中没有对日期的定义确实是一件憾事.
最后只有自己重新写了一个深拷贝的功能.



可以在转换JSON的时候将日期可以转成"new Date(12210301)" 的这种格式。
当然,重写一个深拷贝也是一个好方法。


smiky 写道
整来整去,效率呢?

这只是一个思路,其实这种序列化反序列化的效率的确不是很高(相对而言),不过值得庆幸的是,这个操作在客户端完成的。而且我们也太可能用JS去处理大型数据,所以这个可以不用太担心。


当然楼上那个效率相对比较高一些,一般应用也足够使用了。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics