1

現在、深さが不明なネストされたjavascriptオブジェクトがあります。オブジェクトは純粋に動的に生成されるため、削除するプロパティの親の名前がわかりません(必要に応じて、いくつかのものを作り直して取得することもできますが、それを回避しようとしています)。

search_tree(name)私は現在、プロパティが見つかるまでオブジェクトのすべてのプロパティを検索し name : "name" 、ツリーのその場所にデータを追加するためにそのオブジェクトを返すという関数を持っています。

ただし、そのオブジェクトをツリーから削除する必要があり、まだ機能していません。私が試してみました:

obj = search_tree(name);
delete obj;

objは実際にはツリー内のオブジェクトではなく、それへの参照であるため、これは機能しないと思います。

delete search_tree(name);

また、結果は得られませんでした。これはこの方法で行うことができますか、それともsearch_tree何らかの形で遺産を返すように(または単に別のものを作成するために)関数を変更する必要がありますか?ありがとう

search_treeからのコード

function search_tree(element, matchingName){
     if(element.name == matchingName){
          return element;
      }else if (element.children != null){
            var result = null;
            for(var child in element.children){
                 result = searchTree(element.children[child], matchingName);
            }
            return result;
      } else {
            return null;
      }
}

この機能は説明なしでは少し不明確かもしれないことに気づきました。ツリー内の各オブジェクトには、「子」と呼ばれる子オブジェクトがあり、そこには他のオブジェクトがいくつでも格納されます。オブジェクトには、ツリーの一部として検索したくない子オブジェクトが含まれていることが多いため、「子」レイヤーを追加しました。要素は検索対象のオブジェクトです

4

1 に答える 1

2

ツリーからオブジェクトを削除しようとしていますか?そして、それはあなたがしたいすべてですか?

その場合は、ツリーの「親」ノードを検索内に保存します。2番目の関数を記述します。おそらくprune_tree、親とオブジェクト(または両方をプロパティとして持つオブジェクト)を渡してから、親を検索するためにfor...を実行します。parent [key] ===オブジェクトの場合、parent[key]を削除します。

これで、その特定の親にそのオブジェクトが含まれなくなった(または必要な)完全なツリーが作成されました。

search_treeこれは再帰的である必要があるため、もう1つのパラメーター()parentを指定します。このパラメーターは、ヒットする深度のレベルごとに1回フィードします(各子は同じ親を持ちます)。親がルートである(したがって、親がない)ことを必ず考慮してください。殺したいオブジェクトを見つけたら、return { object : objectNode, parent : parentNode };

それをプルーン機能に入れてください。parentNodeへの参照は、parentNode.objectNodeを削除すると、ツリーから削除されることを意味します(結局のところ、これは単なる参照であるため)。

編集:

上記に基づく:

function prune_tree (parent, child) {
    var key = "";
    for (key in parent) { if (parent.hasOwnProperty(key) && parent[key] === child) {
        delete parent[key];
    }
}


function search_tree (name, element, parent) {
    var key = "";
    if (element.name === name) {
        return prune_tree(parent, element);
    } else if (!element.children) {
        return null;
    } else {
        parent = element.children;
        for (key in children) { if (children.hasOwnProperty(key) {
            return search_tree(name, children[key], parent);
        }}
    }
}

繰り返しているときに実際に何をしているのか(特定の戻り値に依存しているかどうかなど)は100%わかりません...複数のオブジェクトがあるかどうかさえわかりませんルートノードを含む異なるブランチに同じ名前を付けます)。

しかし、私がそこに持っているもののようなものはあなたの木を再帰させるべきです。これは(子が格納される場所)に設定parentされ、次に子の各オブジェクトをループして関数を再度呼び出し、次のセットに渡されます。したがって、子要素になり、それを保持するオブジェクトになります。element.childrenparentelementparentchildren

element.nameがと完全に一致する場合はname、別の関数を呼び出し、prune_tree保存されたparent要素と現在の子を渡しelementます。

の内部で、探している子が見つかるまでprune_tree、のキーを繰り返し処理します。それからそれは親から離れます。parentelementdelete

ここで実際に驚くことはないはずです。この特定の関数セットは、すべてのブランチのすべてのノードにアクセスするまで実行され続ける可能性があります。ノードの場合、これをチャンクに分割することを検討することをお勧めします。そうしないと、一部のブラウザーの呼び出しスタックが分割されます。ノードが1000以下しかない場合、またはスタックが大きいブラウザーのみをターゲットにしている場合は、同じ名前のすべてを削除する必要があります。

繰り返しになりますが、これはすべて、これが意図した結果であるかどうか、戻り値の取得に依存している場合、それらを使用して何かを行う場合、またはこれを起動することを期待している場合は、ツリーのルートを渡して期待するかどうかにかかっています。枝を浄化する機能。

また、剪定されたオブジェクトで何かをしたいのか、それとも「名前」という名前の専制政治から木をきれいにすることが重要なのかどうかもわかりません。

于 2012-09-12T04:40:43.930 に答える