2012-08-28 83 views
3

我搜索了一些时间来找到一种方法来克隆一个dic,我发现了一些选项,但他们没有工作。一个是使用byteArray,它只适用于你注册所有涉及的类,并且你的类的所有构造参数的默认值为< - 这不是我的选择。如何克隆字典(及其内容)?

Ohter是,副本,但只适用于第一个值,该一个:

private function clone(original:Dictionary):Dictionary { 
    var cloned:Dictionary = new Dictionary(); 
    for(var key:Object in original) { 
     cloned[key] = original[key]; 
    } 
    return cloned; 
} 

但是,它不克隆主字典里面dicionary。

你知道如何制作一个给定字典的完美克隆,即使它里面有另一个字典吗?

谢谢。

回答

1

做一个递归函数检查元素类型,如果他们是字典本身继续递归和复制。

喜欢的东西(未经测试):

private function clone(original:Dictionary):Dictionary { 
    var cloned:Dictionary = new Dictionary(); 
    for(var key:Object in original) { 
     if(original[key] is Dictionary) 
     cloned[key] = clone(original[key]); 
     else 
     cloned[key] = original[key]; 
    } 
    return cloned; 
} 

编辑:

好像一个简单的嵌套字典这样的工作:

var dic:Dictionary = new Dictionary(); 
dic["test"] = 5; 
dic["otherDic"] = new Dictionary(); 
dic["otherDic"]["foo"] = 1; 
dic["otherDic"]["bar"] = "bar"; 

var copy:Dictionary = clone(dic); 

dic["test"] = 0; 
dic["otherDic"]["foo"] = 0; 
dic["otherDic"]["bar"] = "changed"; 
    //copy doesn't change, copy and dic are different dictionaries 
+0

它不工作,它不抛出任何错误,但它们仍然是同一个对象。 – Artemix

+0

@sch你是正确的,如果字典持有对象而不是简单类型,他们将需要正确复制。这适用于简单的类型。 –

+0

我创建了自定义对象的数组,然后将它们放入字典中,当我循环使用dics时,我做了removeChild,它们被移除,但是,如果我手动创建对象,它会起作用。我的理解是,对象是相同的,它们不是副本,它们是同一个对象。 – Artemix