私はそこにいる誰かがこれで私の救助に来てくれることを望んでいました. なんらかの理由で、node.js の再帰が頭に浮かびません。別の方法があれば、再帰である必要さえありません。
階層をセットに格納するために redis セットを使用しています。
SADD parents.<name> <parent1> <parent2>
次に、parent1 と parent2 にもエントリがあり、さらに上に進みます。オブジェクトのJSON配列に変換したい。
JSON は次のようになります。
[
{
label: <name>,
parents: [
{ label: <parent1>,
parents: [ {label: <grandparent1>}] },
{ label: <parent2> }
]
}
]
などなど。これはどの深さでも機能するはずですが、平均して 4 ~ 6 ノードの深さしかありません。
これは、私が最初のレベルを取得するだけで遊んでいるコードです。
var redis = require('node-redis');
var r_client = redis.createClient();
function get_parents (name, current, cb) {
var output = new Array;
output.push( { label: name, parents: [] } );
r_client.smembers('parents.' + name, function(err, reply) {
for (var i = 0; i < reply.length; i++)
{
var name = reply[i].toString('utf8');
output[i].parents.push({label: name, parents: [] });
}
cb (output);
});
}
get_parents( 'bob', function(out) {console.log('Final output: ' + JSON.stringify( out ))} );
私は基本的にこれをやりたいと思っています:
- ルート ノードから開始します。redis を呼び出して、親を取得します。
- ルート ノードのビルド オブジェクト。
- 同じ関数を呼び出して、他のオブジェクトを構築します。
- redis への呼び出しが null に戻り始めると、呼び出しが戻り、オブジェクトの結合が開始されます。
どんな助けでも大歓迎です。
編集: get_parents を更新しました (まだ機能しません):
function get_parents (name, cb) {
r_client.smembers('parents.' + name, function(err, reply) {
for (var i = 0; i < reply.length; i++)
{
var name = reply[i].toString('utf8');
output.push( { label: name, parents: [] } );
output[i].parents = get_parents (output[i].parents.name, cb);
}
cb (output);
});
}
編集: Promises を使用することにしたので、そのオプションを追求しました。助けてくれてありがとう!