Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Object 使用ExtJS的jQuery深度复制?_Object_Extjs_Extend_Deep Copy - Fatal编程技术网

Object 使用ExtJS的jQuery深度复制?

Object 使用ExtJS的jQuery深度复制?,object,extjs,extend,deep-copy,Object,Extjs,Extend,Deep Copy,我尝试过,但很惊讶我怎么不能使用ExtJS。让我用一个代码块来解释 在jQuery中 console.clear(); var a = { b: 5, c: 4, o: { l: 2, p: 2 } } var b = { k: 4, l: 3, c: 5, o: { m: 2, l: 1 } } var ex = $.extend(true, a, b);

我尝试过,但很惊讶我怎么不能使用ExtJS。让我用一个代码块来解释

在jQuery中

console.clear(); var a = { b: 5, c: 4, o: { l: 2, p: 2 } } var b = { k: 4, l: 3, c: 5, o: { m: 2, l: 1 } } var ex = $.extend(true, a, b); console.dir(ex) console.clear(); 变量a={ b:5, c:4, o:{ l:2, p:2 } } 变量b={ k:4, l:3, c:5, o:{ m:2, l:1 } } var ex=$.extend(true,a,b); 控制台目录(ex) 这是输出

ex = { a: { q: 2 }, b: 5, c: 5, o: { l: 1, p: 2, m: 2 } } ex={ a:{ q:2 }, b:5, c:5, o:{ l:1, p:2, m:2 } } Ext apply、applyIf、copyTo不是这样工作的。如何在ExtJS中生成输出


提前谢谢

Ext中不支持深度复制。有
Ext.apply
Ext.applyIf
,但它们都只在哈希映射的第一级工作,并将覆盖而不是合并任何嵌入式数组或哈希


事实上,文档明确指出Ext.apply是用于配置对象的,这并不重要,只是为了说明它不打算用作合并实用程序功能,尽管如果您只想合并第一级/深度,它基本上可以使用。

对于最近的一个项目,我们采用了以下方法:

Ext.deepCopy = function(p, c) {
    c = c || (p.constructor === Array ? [] : {});
    for (var i in p) {
        if (typeof p[i] === 'object' && p[i] !== null) {
            c[i] = p[i].constructor === Array ? [] : {};
            Ext.deepCopy(p[i], c[i]);
        } else {
            c[i] = p[i];
        }
    }
    return c;
};

使用这种方法,这正是你想要的。

是的,你是对的,应用和应用如果不这样做,但我想确定。谢谢你的回答。我正在为你的“Pageant and git不记得我的公钥和密码”问题写一个答案,指向(参见2009年6月5日上午9:38的评论):也许这对你的情况会有帮助。@VonC谢谢你,伙计,真的谢谢:-)你需要额外检查“null”值对象,因为它尝试获取“p[i].constructor”时失败。我把这行改成:if(typeof p[I]='object'&&p[I]!=null)@Cankut:Good catch!很容易忘记
typeof(null)==“object”
。虽然我使用了
,但我已经更新了答案以包含您的修复==而不是
=。那么,这段代码是按值还是按引用复制对象属性?@user1186523:对象和数组是深度复制的,所以它们是按值复制的。不可变类型(如函数)通过引用复制。它不克隆数组属性:
a1={“a”:[];a2=Ext.Object.merge({},a1);a1.a==a2.a
=>正确