2011-01-19 69 views
2

什麼是最好的方式來做一個gwt覆蓋類型的深層副本?GWT覆蓋深度複製

我正在尋找一個檢查GWT覆蓋並克隆它的函數或庫。它必須能夠克隆包含的數組或對象。

謝謝

回答

2

基於Lineman78的answer並考慮到從A利維這個其他answer我創建了以下功能:

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; 
    }-*/; 

} 

它支持對象的深層副本,數組,日期,字符串,數字,或布爾值。正如A. Levy所解釋的那樣,只要對象和數組中的數據形成樹結構,該函數就會工作。

5

有兩種方法,我會考慮。大部分時間覆蓋對象都與JSON結合使用,所以你可以隻字符串化的對象,並解析結果:

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

OR

public static native MyOverlayType fromJson(String json)/*-{ 
     return JSON.parse(json); 
}-*/; 
public native String getJson()/*-{ 
     return JSON.stringify(this); 
}-*/; 
public MyOverlayType deepCopy(){ 
     return fromJson(getJson()); 
} 

另一種選擇是一個純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; 
    }-*/; 
} 
+0

你在哪裏定義clone_obj功能?使用JSNI進行遞歸是我發現更困難的事情之一。 – 2011-01-19 00:49:43

0

我發現克隆JavaScriptObject最簡單的方法是使用由GWT提供的JsonUtils類:

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

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