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