2014-01-06 70 views

回答

4

我還沒有找到一個簡單的方法去做,其他人似乎建議使用JSON.stringify中的自定義替換函數來控制哪些屬性已被訪問。

我已經嘗試寫這樣的替代品:

function detector(obj) { 
    function collector (stack, key, val) { 
     var idx = stack[stack.length - 1].indexOf(key); 

     try { 
      var props = Object.keys(val); 
      if (!props.length) throw props; 
      props.unshift({idx : idx}); 
      stack.push(props); 
     } catch (e) { 
      while (!(stack[stack.length - 1].length - 2)) { 
       idx = stack[stack.length -1][0].idx; 
       stack.pop(); 
      } 

      if (idx + 1) { 
       stack[stack.length - 1].splice(idx, 1); 
      } 
     } 

     return val; 
    } 

    var stack = [[]]; 

    try { 
     JSON.stringify(obj, collector.bind(null, stack)); 
    } catch (e) { 
     if (e.message.indexOf('circular') !== -1) { 
      var idx = 0; 
      var path = ''; 
      var parentProp = ''; 
      while(idx + 1) { 
       idx = stack.pop()[0].idx; 
       parentProp = stack[stack.length - 1][idx]; 
       if (!parentProp) break; 
       path = '.' + parentProp + path; 
      } 

      console.log(path); 
     } 
    } 
} 

在遍歷JSON樹(可能是樹:))它收集已作爲JSON被訪問並儘快屬性的名稱是什麼它是。 stringify檢測到循環引用並拋出,'stack'變量將包含它正在遍歷的子樹的蹤跡。並且它將這個路徑記錄到控制檯。

但是,這不是一個經過嚴格測試的解決方案。