Object 使用ExtJS的jQuery深度复制?
我尝试过,但很惊讶我怎么不能使用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中生成输出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);
提前谢谢 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
=>正确