学習のためにJavaScriptでオブジェクトをトラバースしています。現時点では、関数が与えられた最初のオブジェクトの各プロパティを吐き出し、見つかった子オブジェクト (関数を含む) に再帰することになります。
例として window オブジェクトを使用すると、window.top が window を指しているため、関数は無限ループに陥ります。オブジェクトへの再帰を避けるために、既にトラバースしたオブジェクトを追跡するにはどうすればよいですか?
学習のためにJavaScriptでオブジェクトをトラバースしています。現時点では、関数が与えられた最初のオブジェクトの各プロパティを吐き出し、見つかった子オブジェクト (関数を含む) に再帰することになります。
例として window オブジェクトを使用すると、window.top が window を指しているため、関数は無限ループに陥ります。オブジェクトへの再帰を避けるために、既にトラバースしたオブジェクトを追跡するにはどうすればよいですか?
配列を使用して、現在調べているオブジェクトを格納できます。これは、循環参照の検出に役立つはずです。
var stack = [];
function traverse(object) {
if (stack.indexOf(object) !== -1) {
return; // if the condition above is true, we have a circular reference
}
stack.push(object);
// here go through object properties, recursively calling traverse()
stack.pop();
}