Gwt 覆盖深拷贝

Gwt 覆盖深拷贝,gwt,overlay,clone,Gwt,Overlay,Clone,制作gwt覆盖类型的深度副本的最佳方法是什么 我正在寻找一个函数或库来检查GWT覆盖并克隆它。它必须能够克隆包含的数组或对象 我有2种方法可以考虑。大多数情况下,重叠对象都与JSON结合使用,因此您可以将对象字符串化并解析结果: public native MyOverlayType deepCopy()/*-{ return JSON.parse(JSON.stringify(this)); }-*/; 或 另一个选项是纯javascript方法,它将维护其他东西,如函数指针,并且可能更

制作gwt覆盖类型的深度副本的最佳方法是什么

我正在寻找一个函数或库来检查GWT覆盖并克隆它。它必须能够克隆包含的数组或对象


我有2种方法可以考虑。大多数情况下,重叠对象都与JSON结合使用,因此您可以将对象字符串化并解析结果:

public native MyOverlayType deepCopy()/*-{
  return JSON.parse(JSON.stringify(this));
}-*/;

另一个选项是纯javascript方法,它将维护其他东西,如函数指针,并且可能更有效

public class JsoUtils
{
    @SuppressWarnings("unchecked")
    public static <T extends JavaScriptObject> T deepCopy(T obj)
    {
        return (T) deepCopyImpl(obj);
    }

    private static native JavaScriptObject deepCopyImpl(JavaScriptObject obj)/*-{
        if (typeof obj !== 'object' || obj === null) {
            return obj;
        }

        var c = obj instanceof Array ? [] : {};

        for (var i in obj) {
            if (obj.hasOwnProperty(i)) {
                if (typeof obj[i] !== 'object' || obj[i] === null)
                    c[i] = obj[i];
                else
                    c[i] = @com.example.gwt.client.JsoUtils::deepCopyImpl(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[i]);
            }
        }

        return c;
    }-*/;
}
公共类JsoUtils
{
@抑制警告(“未选中”)
公共静态T深度复制(T obj)
{
返回(T)deepCopyImpl(obj);
}
私有静态本机JavaScriptObject deepCopyImpl(JavaScriptObject obj)/*-{
if(对象类型!='object'| | obj===null){
返回obj;
}
var c=数组的obj实例?[]:{};
用于(obj中的var i){
if(对象为自有财产(i)){
if(对象类型[i]!='object'| |对象[i]==null)
c[i]=obj[i];
其他的
c[i]=@com.example.gwt.client.JsoUtils::deepCopyImpl(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[i]);
}
}
返回c;
}-*/;
}
基于Lineman78并考虑到A.Levy的这一点,我创建了以下功能:

public class JsoUtils {

    @SuppressWarnings("unchecked")
    public static <T extends JavaScriptObject> T deepCopy(T obj)
    {
        return (T) deepCopyImpl(obj);
    }

    private static native JavaScriptObject deepCopyImpl(JavaScriptObject obj) /*-{

        if (obj == null) return obj;

        var copy;        

        if (obj instanceof Date) {
            // Handle Date
            copy = new Date();
            copy.setTime(obj.getTime());
        } else if (obj instanceof Array) {
             // Handle Array
            copy = [];
            for (var i = 0, len = obj.length; i < len; i++) {
                if (obj[i] == null || typeof obj[i] != "object") copy[i] = obj[i];
                else copy[i] = @com.amindea.noah.client.utils.JsoUtils::deepCopyImpl(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[i]);
            }
        } else {
            // Handle Object
            copy = {};
            for (var attr in obj) {
                if (obj.hasOwnProperty(attr)) {
                    if (obj[attr] == null || typeof obj[attr] != "object") copy[attr] = obj[attr];
                    else copy[attr] = @com.amindea.noah.client.utils.JsoUtils::deepCopyImpl(Lcom/google/gwt/core/client/JavaScriptObject;)(obj[attr]);
                }
            }
        }        
        return copy;
    }-*/;

} 
公共类JsoUtils{
@抑制警告(“未选中”)
公共静态T深度复制(T obj)
{
返回(T)deepCopyImpl(obj);
}
私有静态本机JavaScriptObject deepCopyImpl(JavaScriptObject obj)/*-{
如果(obj==null)返回obj;
var拷贝;
if(obj实例截止日期){
//处理日期
复制=新日期();
copy.setTime(obj.getTime());
}else if(阵列的obj实例){
//句柄数组
拷贝=[];
对于(变量i=0,len=obj.length;i

它支持对象、数组、日期、字符串、数字或布尔值的深度复制。正如函数所解释的,只要对象和数组中的数据形成树结构,该函数就可以工作。

我发现克隆JavaScriptObject最简单的方法是使用GWT提供的JsonUtils类:

import com.google.gwt.core.client.JsonUtils;

final String taskJson = JsonUtils.stringify(selectedTask);
TaskJso task = JsonUtils.safeEval(taskJson).cast();

您在哪里定义clone_obj函数?在JSNI中使用递归性是我发现比较困难的事情之一。哦,很抱歉,我的副本中没有提到这一点。。。只需一秒钟即可更新+1谢谢,你的功能帮了大忙。我对它进行了修改,以消除不必要的类型检查,支持复制日期,并以非关联方式迭代数组。
import com.google.gwt.core.client.JsonUtils;

final String taskJson = JsonUtils.stringify(selectedTask);
TaskJso task = JsonUtils.safeEval(taskJson).cast();