【发布时间】:2023-03-21 21:47:01
【问题描述】:
我希望外面有人能用这个来拯救我。出于某种原因,我无法理解 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,所以I pursued that option。感谢大家的帮助!
【问题讨论】:
-
一种简单的方法是将json存储到每个
parent.name而不是一个集合 -
@GeoPhoenix - 我同意,但这是一个更大项目的一部分,所以这样做是有意义的。
-
请记住,redis 并不是一个数据库,例如 mongoDB 或 mysql,它们具有执行此操作的构建功能,或者以“有意义”的方式存储,redis 是只是一个键值存储,所以恕我直言,将您从另一个来源获取的内容存储到 Redis,让我们说
tree.NAME过期.. 比查询分层数据更有意义,我的意思是,twitter 关注者/关注它的 ok ,但是以这种方式存储树之类的东西,有点错过了redis的重点。不是说那不可行..