だが、私はそうのようなネストされたオブジェクトがあるとしましょう:データ構造のようなツリーのすべてのパスをトレースするには?
{
label: 'parent',
eyeColor: 'brown',
kids: [
{
label: 'kid_0',
eyeColor: 'brown',
kids: [
{
label: 'kid_0_0',
eyeColor: 'green',
kids: []
},
{
label: 'kid_0_1',
eyeColor: 'brown',
kids: [
{
label: 'kid_0_1_0',
eyeColor: 'brown',
kids: []
}
]
}
],
},
{
label: 'kid_1',
eyeColor: 'brown',
kids: [
{
label: 'kid_1_0',
eyeColor: 'brown',
kids: []
}
],
},
{
label: 'kid_2',
eyeColor: 'green',
kids: []
}
]
};
私はすべてのユニークなパスを保存したい場合は、どのように私は再帰的に行うのでしょうか?私は多くの試みを試みましたが、ユニークなパスを得ることができません(私のパスは前のパスの上に構築されます)。
だから私の予想される出力は次のようになります。
[
['parent', 'kid_0', 'kid_0_0],
['parent', 'kid_0', 'kid_0_1, kid_0_1_0],
['parent', 'kid_1', 'kid_1_0],
['parent', 'kid_2]
]
しかし、私は、私はbrown
以外eyeColor
と子供またはノードを見つけたときのパスを停止したい場合、パスはそこに停止します。そして、何次取得するために変更する必要があります:これは今ある私の現在のコード、B/Cの最大コールスタックのうち、エラーが-INGのさ
[
['parent', 'kid_0', 'kid_0_1, kid_0_1_0],
['parent', 'kid_1', 'kid_1_0],
]
。
var printPaths = function(node, color) {
var paths = [];
var trackPath = function(obj, feature, path) {
if (obj.eyeColor === 'brown') {
path.push(node.label);
} else if (obj.eyeColor !== 'brown') {
paths.push(path);
} else if (obj.kids.length === 0) {
paths.push(path);
}
for (var i = 0; i < obj.kids.length; i++) {
trackPath(obj.kids[i], feature, path)
path.pop();
}
};
trackPath(node, color, []);
return paths;
}
動作しなくても試してみてください。 – Bergi
@Bergi私は壊れたコードを投稿しました。私は経験豊富なプログラマーが問題にどのようにアプローチしているのかを見たいと思っていたので、投稿することを躊躇しました。 – AlanH
このアプローチは、[配列は参照値であり、明示的にコピーする必要がある]という点を除いて、きれいに見えます(http://stackoverflow.com/q/7486085/1048572)。そこで、 '.pop()'呼び出しを落とし、その代わりに再帰呼び出しを 'trackPath(obj、feature、path.slice())'にします。 – Bergi