2017-01-11 1 views
0

Я обертываю страницу AceEditor в веб-представлении и возвращаю результаты события в контейнер, и он висит на объектах, содержащих круглые ссылки.Есть ли способ удалить круговые ссылки в Ace

Есть ли способ в ace удалить круговые ссылки в объектах, отправленных в событиях редактора Ace?

ответ

0

Я не нашел его, поэтому сам написал. Это, кажется, работает до сих пор:

"use strict"; 

// returns an object that removes circular references 
document.removeReferences = function (object, maxDepth, depth, objects, clone, debug) { 
    if (objects==null) { objects = []; } 
    if (clone==true) { clone = {}; } 
    maxDepth = maxDepth==null ? 10 : maxDepth; 
    depth = depth==null ? 0 : depth; 
    var padding = ""; 
    var value; 

    if (debug) { for (var i=0;i<depth;i++) { padding += " "; } }; 

    if (debug && typeof object != 'function') { 
    console.log(padding + "\nDepth:" + depth + " max depth:" + maxDepth); 
    } 

    if (typeof object == 'object') { 
    if (object!=null && objects.indexOf(object)==-1) { 
     if (debug) console.log(padding+"caching object:"+object); 
     objects.push(object); 
    } 
    else { 
     if (debug) console.log(padding+"object found. skipping"); 
     return clone; 
    } 

    for (var key in object) { 
     value = object[key]; 

     if (debug && typeof value!="function") { 
     console.log(padding+""+key + ":" + typeof value); 
     } 

     if (object.hasOwnProperty(key) && (typeof value == 'object')) { 

     // remove circular references 
     if (objects.indexOf(value)!=-1) { 
      if (debug) console.log(padding+"recursive object found. deleting:"+key); 

      if (clone==null) { 
      delete object[key]; 
      } 
      else { 
      delete clone[key]; 
      } 

      continue; 
     } 

     if (depth>=maxDepth) { 
      //object[key] = null; 

      if (clone==null) { 
      if (debug) console.log(padding+"max object limit - deleting:"+key); 
      delete object[key]; 
      } 
      else { 

      if (typeof value=="array") { 
       clone[key] = null; 
      } 
      else { 
       clone[key] = null; 
      } 
      delete clone[key]; 
      if (debug) console.log(padding+"max object limit - not adding:"+key); 
      } 

     } 
     else { 

      if (clone==null) { 
      if (value!=null) { 
       if (debug) console.log(padding+"diving into:"+key); 
       document.removeReferences(value, maxDepth, depth+1, objects, null, debug); 
      } 
      } 
      else { 
      if (typeof value=="array") { 
       clone[key] = value.slice(); 
      } 
      else { 
       clone[key] = value!=null ? {} : null; 
      } 

      if (value!=null) { 
       if (debug) console.log(padding+"diving into:"+key); 
       document.removeReferences(value, maxDepth, depth+1, objects, clone[key], debug); 
      } 
      } 
     } 
     } 
     else if (typeof value == 'function') { 
      //object[key] = null; 
      if (clone==null) { 
      delete object[key]; 
      } 
      else { 

      } 
     } 
     else { 

     if (clone!=null) { 
      if (debug) console.log(padding+" cloning key :"+key); 

      if (typeof value=="array") { 
      clone[key] = value.slice(); 
      } 
      else { 
      clone[key] = value!=null ? value : null; 
      } 
     } 
     } 
    } 
    } 

    if (clone!=null) { 
    if (debug) console.log(padding+"return clone"); 
    return clone; 
    } 

    if (debug) console.log(padding+"return object"); 
    return object; 
} 

Вы затем использовать что-то вроде этого:

// inside an ace editor event: 
var debug = true; 
var clonedEvent = document.removeReferences(event, 0, null, null, true, debug); 

 Смежные вопросы

  • Нет связанных вопросов^_^