私は最近、OPがオブジェクトのプロパティへのパスを探したかったので、this questionが尋ねられたので、私はpsuedocodeで答えました。実際には解決策を書く。しかし、問題は私にとっては面白かったので、とにかく解決策を書こうとした。ここで私は、これまでに作ってみたものです:オブジェクトを検索しようとすると無限ループが発生する
function isEmpty(obj) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}
function Node(obj, parent, searchTarget) {
this.parent = parent;
this.obj = obj;
this.searchTarget = searchTarget;
this.searchNode = function() {
if(this.obj == this.searchTarget) {
//return this.reconstructPathRecursive();
}
if (!isEmpty(this.obj)) {
var children = [];
for (prop in this.obj) {
if (this.obj.hasOwnProperty(prop)) {
children.push(new Node(this.obj[prop], this, searchTarget));
}
}
var path;
for(var i = 0, len = children.length; i < len; i++) {
path = children[i].searchNode();
if(path) return path;
}
}
}
this.reconstructPathRecursive = function() {
var path = [this], curObj = this.parent;
while (curObj != undefined) {
path.push(curObj);
curObj = curObj.parent;
if(curObj == undefined) break;
}
return path;
}
this.findPath = function() {
return this.searchNode();
}
}
var myObj = {
nullRoot: "gotcha!",
path1: {
myFunc: function() {
alert("Success!");
}
}
}
function findFunctionPath(obj, func) {
return new Node(obj, undefined, func).findPath();
}
var thisFunc = myObj.path1.myFunc;
console.log("--");
console.log(findFunctionPath(myObj, thisFunc));
アイデアは、私は、オブジェクトのプロパティのそれぞれを表すNodeオブジェクトにthis.searchNode()
を呼ぶだろうということです。 searchNode()
は、現在のオブジェクトを子ノードのそれぞれにparent
として渡して、結果のプロパティノードのそれぞれでそれ自身を呼び出します。検索する関数が見つかった場合は、reconstructPathRecursive()
と呼びます(各ノードの親プロパティを使用しています)。
しかし、「最大コールスタックサイズを超えました」というメッセージが表示されます。これを実行するとエラーが発生しますlive test私はそれが何とか無意味なループを間違って書いたことを意味します。私のロジックの欠陥はどこにありますか?その無限ループはどこに潜んでいましたか? console.log
は、searchNode
が何度も繰り返し呼び出されていることを示していますが、オブジェクトが空でない場合にのみ呼び出しています。オブジェクトをどこにでも参照することはできません(私は考えません...) 、私は本当にここでうんざりしています。
編集:私はsearchNode()
機能でthis.obj
にそれを呼び出すことができるように、グローバル関数へのノードの機能からisEmpty
を変更するには、多少のコードを更新しました。これまでは、Nodes(これは常に少なくとも2つのプロパティを持つため、無限ループになります)で呼び出され、参照されるオブジェクトでは呼び出されませんでした。これは修正されましたが、エラーは解決されません。
別の編集:見つけて別のエラーを修正しました(Satyajitの答えを参照)。しかし、無限ループをやっている。
私はどこでそれをやっているのか詳しく説明できますか?私はどこにも見ません。すでに私が訪れたことをどのように追跡するかを実装する方法を見ていきます。助けてくれてありがとう! –
@ElliotBonneville、問題は、 'myObj'が周期的であることです。あなたは 'myObj'がどのように派生しているかを示していないので、コードであなたを指摘できません。 –
私が提供したjsFiddleを訪問しましたか?今すぐリンクを更新してください。また、myObjは単なる別のオブジェクトです。あなたはそれがどのように得られたかを見ます。それは単なるテストオブジェクトなので、私はその上で自分の関数をテストすることができます。 –