在JavaScript中嵌套对象的深度复制阵列 [英] Deep copying array of nested objects in javascript

查看:118
本文介绍了在JavaScript中嵌套对象的深度复制阵列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在javascript中嵌套对象的深拷贝数组。我的阵列看起来像这样

  VAR ARR = {[名称:亚当,年龄:21},
    {名:房地美,年龄35,孩子们:[{名:水银,年龄25}]},
    {名:吉姆,年龄35,孩子们:[{名:莫里森,年龄25,孩子们:[{名:一些,年龄:40}]}]}
    ];

我要让每一个对象的深层副本是我想创建ARR的精确拷贝到其中不应该有对象引用新的数组的数组中。数组的深度也未知这是孩子阵列可高达任何级别。
我已经通过这个链接了
<一href=\"http://stackoverflow.com/questions/9885821/copying-of-an-array-of-objects-to-another-array-without-object-reference-in-java\">Copying对象到另一个数组的数组,而不在JavaScript(深层副本)对象引用但这并没有帮助我。我用Google搜索,发现jQuery的一些解决方案,但没有帮助我,因为我不具备的jQuery的知识。

我也试过用递归实现它,但是这不是工作压力太大
http://ideone.com/kJi5X3

我想这样做在JavaScript只是不使用jQuery或任何东西。我是新来的JavaScript,所以我可能已经错过了,如果有任何图书馆或简单的方法来做到这一点。
请帮我解决这个问题。先谢谢了。


解决方案

您有两个主要选项:


  1. 使用 JSON.stringify JSON.parse

      VAR副本= JSON.parse(JSON.stringify(原件));

    但是,将不予办理日期正则表达式等。除非正确你写一个替代品和齐磊。


  2. 使用递归函数,是这样的:


\r
\r

VAR的toString = Object.prototype.toString;\r
功能正是deepcopy(OBJ){\r
    VAR RV;\r
\r
    开关(typeof运算OBJ){\r
        案对象:\r
            如果(OBJ === NULL){\r
                //空=&GT;空值\r
                RV = NULL;\r
            }其他{\r
                开关(toString.call(物镜)){\r
                    案[对象数组]:\r
                        //这是一个数组,创建一个新的数组\r
                        条目//深层副本\r
                        RV = obj.map(deepcopy的);\r
                        打破;\r
                    案[对象日期]:\r
                        //克隆日期\r
                        RV =新的日期(OBJ);\r
                        打破;\r
                    案[对象正则表达式]:\r
                        //克隆的正则表达式\r
                        RV =新的RegExp(OBJ);\r
                        打破;\r
                    // ...大概几人\r
                    默认:\r
                        //其他一些种类的对象,深复制其\r
                        //属性放到一个新的对象\r
                        RV = Object.keys(OBJ)。降低(函数(preV,键){\r
                            preV [关键] =正是deepcopy(OBJ [关键]);\r
                            返回preV;\r
                        },{});\r
                        打破;\r
                }\r
            }\r
            打破;\r
        默认:\r
            //这是一个原始的,通过分配复制\r
            RV = OBJ;\r
            打破;\r
    }\r
    返回rv;\r
}\r
VAR一个= [1,{foo的栏},['一','B'],新的Date()];\r
snippet.log(JSON.stringify(一));\r
变种B = deepcopy的(一);\r
snippet.log(JSON.stringify(B));

\r

&LT; - 脚本提供了`snippet`对象,请参见http:/ /meta.stackexchange.com/a/242144/134069 - &GT;\r
&LT;脚本SRC =htt​​p://tjcrowder.github.io/simple-snippets-console/snippet.js&GT;&LT; / SCRIPT&GT;

\r

\r
\r

请注意,上面的使用ES5展示了所有现代浏览器而不是一些旧的,像IE8 present。所有上面使用的功能都可以然而polyfilled,对旧版浏览器。

这不尝试进入处理对数组中的对象的自定义构造函数或preserving原型;这样做使事情显着更复杂,更不可能让不完美如何调用这些构造的复制操作的约定。你可以通过分配相同的原型接近,但不会在构造函数中,特别是对在它设置为关闭功能占的逻辑。

I am trying to deep copy array of nested objects in javascript. My array look like this

var arr = [{name:"adam",age:"21"},
    {name:"freddie",age:"35",children:[{name:"mercury",age:"25"}]},
    {name:"jim",age:"35",children:[{name:"morrison",age:"25",children:[{name:"some", age:"40"}]}]}
    ];

I want to make a deep copy of every object inside the array that is i want to create a exact copy of arr into new array which should not have object reference. Depth of array is also unknown that is children array can be upto any level. I have gone through this link Copying of an array of objects to another Array without object reference in javascript(Deep copy) but that did not help me. I googled and found some solutions in jQuery but that did not help me as i dont have knowledge of jQuery.

I also tried implementing it with recursion but that's not working too http://ideone.com/kJi5X3

I want to do it in javascript only without using jQuery or anything. I am new to JavaScript so i may have missed if there is any library or simple method to do this. Please help me to solve this problem. Thanks in advance.

解决方案

You have two main options:

  1. Use JSON.stringify and JSON.parse:

    var copy = JSON.parse(JSON.stringify(original));
    

    But that won't handle Date, RegExp, etc. correctly unless you write a replacer and a reviver.

  2. Use a recursive function, something like this:

var toString = Object.prototype.toString;
function deepCopy(obj) {
    var rv;

    switch (typeof obj) {
        case "object":
            if (obj === null) {
                // null => null
                rv = null;
            } else {
                switch (toString.call(obj)) {
                    case "[object Array]":
                        // It's an array, create a new array with
                        // deep copies of the entries
                        rv = obj.map(deepCopy);
                        break;
                    case "[object Date]":
                        // Clone the date
                        rv = new Date(obj);
                        break;
                    case "[object RegExp]":
                        // Clone the RegExp
                        rv = new RegExp(obj);
                        break;
                    // ...probably a few others
                    default:
                        // Some other kind of object, deep-copy its
                        // properties into a new object
                        rv = Object.keys(obj).reduce(function(prev, key) {
                            prev[key] = deepCopy(obj[key]);
                            return prev;
                        }, {});
                        break;
                }
            }
            break;
        default:
            // It's a primitive, copy via assignment
            rv = obj;
            break;
    }
    return rv;
}
var a = [1, {foo: "bar"}, ['a', 'b'], new Date()];
snippet.log(JSON.stringify(a));
var b = deepCopy(a);
snippet.log(JSON.stringify(b));

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Note that the above uses ES5 features present on all modern browsers but not some older ones, like IE8. All of the features used above can be polyfilled, however, for older browsers.

That doesn't try to get into handling custom constructor functions or preserving prototypes on objects in the array; doing so makes things dramatically more complicated and impossible to make perfect without a convention for how to call those constructors for a copy operation. You can get close by assigning the same prototype, but that wouldn't account for logic within the constructor function and in particular for functions set up as closures within it.

这篇关于在JavaScript中嵌套对象的深度复制阵列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆