2014-01-06 23 views
5

大きな構造上にUncaught TypeError: Converting circular structure to JSONがあるとき、正確に循環参照がどこにあるのかを知ることは非常に困難です。JSON.stringifyで循環構造を見つけるには:Uncaught TypeError:循環構造をJSONに変換しますか?

データ構造内の循環要素を簡単に見つける/デバッグする方法はありますか?

+0

巨大ではない場合は、オブジェクトを 'console.dir()'してブラウザコンソールで対話的に突き止めることができます。 – Pointy

答えて

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'変数はそれがトラバースしていたサブツリーのトレースを含みます。そして、このパスをコンソールに記録します。

ただし、これは重大なテスト済みの解決策ではありません。

関連する問題