我希望外面有人可以来拯救我。出于某种原因,我无法理解 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,所以我选择了这个选项。感谢所有的帮助!