使用node.js从redis获取分层数据

使用node.js从redis获取分层数据,node.js,recursion,redis,Node.js,Recursion,Redis,我希望有人能用这个来救我。由于某些原因,我无法在node.js中理解递归。如果有其他方法,它甚至不必是递归 我使用redis集合将层次结构存储在集合中: SADD parents.<name> <parent1> <parent2> SADD父母。 然后,parent1和parent2也将有条目,并继续。我想将其转换为对象的JSON数组 JSON将如下所示: [ { label: <name>, parents: [

我希望有人能用这个来救我。由于某些原因,我无法在node.js中理解递归。如果有其他方法,它甚至不必是递归

我使用redis集合将层次结构存储在集合中:

SADD parents.<name> <parent1> <parent2>
SADD父母。
然后,parent1和parent2也将有条目,并继续。我想将其转换为对象的JSON数组

JSON将如下所示:

[
 {
     label: <name>,
     parents: [
         { label: <parent1>,
           parents: [ {label: <grandparent1>}] },
         { label: <parent2> }
     ]
 }
]
[
{
标签:,
家长:[
{标签:,
父项:[{label:}]},
{标签:}
]
}
]
等等等等。这应该能够适用于任何深度,尽管平均只有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 ))} );
var redis=require('node-redis');
var r_client=redis.createClient();
函数get_parents(名称、当前值、cb){
var输出=新数组;
push({label:name,父项:[]});
r_client.smembers('parents.'+名称,函数(err,reply){
对于(变量i=0;i
我基本上想这样做:

  • 从根节点开始。打电话给redis,找父母
  • 为根目录生成对象 节点
  • 调用相同的函数来构建其他对象
  • 当对redis的调用开始返回null时,这些调用将返回并开始组合对象
任何帮助都将不胜感激

编辑:更新的get_父母(仍然不起作用):

函数获取父对象(名称、cb){
r_client.smembers('parents.'+名称,函数(err,reply){
对于(变量i=0;i

编辑:我决定使用承诺,所以。谢谢你的帮助

TL;DR:我制作了一个NodeJS模块()并解释了实现


以上代码是初始实现

很好的挑战!这是一个符合您需求的实现,我添加了一个“.save(tree,f)”方法,它使用,当然还有

var sampleTree=[{
标签:“label1”,
家长:[{
标签:“label2”,
家长:[{
标签:“label4”,
家长:[]
}]
}, {
标签:“label3”,
家长:[]
}]
}];
//注意:需要使用集合来检索数据
//设置:
//sadd标签1标签2标签3
//sadd label2 label4
var=要求('lodash');
var async=require('async');
var redis=require('redis').createClient();
函数RedisTree(){}
/**
*从Redis迭代异步检索项目
*@param{String}标签名称(集合名称)
*@param{Function}f(err,arrayOfItems)
*/
RedisTree.prototype.\u getItem=函数(标签,f){
var parent=..isArray(..last(参数))?..last(参数):[];
此。成员(标签、功能(错误、卡片){
变量项={
标签:这个。标签(标签),
家长:[]
};
家长推送(项目);
if(cards.length==0){返回f(null,父项);}
map(cards,u.partiOK(this._getItem.bind(this),item.parents),函数(e){f(e,parent);});
}.约束(这个);
};
RedisTree.prototype.\u saveItem=函数(项,f){
var labels=u.pull(item.parents,'label');
如果(labels.length==0){return f();}
redis.sadd(item.label、labels、function(err){
if(err){返回f(err);}
此项。保存项(项。父项,f);
}.约束(这个);
};
/**
*
*@param{Array}arrToSave项目数组
*@param{Function}f(err)
*/
RedisTree.prototype.\u saveItems=函数(arrToSave,f){
forEach(arrToSave,this.\u saveItem.bind(this),f);
};
/**
*从标签中检索名称
*可以重写以提供命名空间支持
*例如,返回标签。子字符串(2);
*@return{[type]}[description]
*/
RedisTree.prototype.label=函数(label){return label;};
/**
*从redis检索“标签”集的每个成员
*可以重写以提供命名空间支持
*例如,redis.smembers('ns.'+标签,f);
*@param{[type]}标签[说明]
*@param{[type]}f[说明]
*/
RedisTree.prototype.members=函数(label,f){redis.smembers(label,f);};
/**
*从Redis加载一棵树
*@param{String}abel即将启动
*@param{Function}f(err,tree)
*/
RedisTree.prototype.load=函数(startAbel,f){this.\u getItem(startAbel,f);};
/**
*从Redis保存一棵树
*@param{Array}trearray
*@param{Function}f(err,tree)
*/
RedisTree.prototype.save=函数(trearray,f){this.\u saveItems(trearray,f);};
以下是如何使用它:

var t = new RedisTree();

// Save the sampleTree
t.save(sampleTree, function(err){
  // or ... retrieve it starting at "label1"
  t.load('label1', function(err, tree){
    console.log("sampleTree === ", JSON.stringify(tree, null, 1));
  });
});

TL;DR:我制作了一个NodeJS模块()并解释了实现


以上代码是初始实现

很好的挑战!这是一个符合您需求的实现,我添加了一个“.save(tree,f)”方法,它使用,当然还有

var sampleTree=[{
标签:“label1”,
家长:[{
标签:“label2”,
家长:[{
标签:“label4”,
家长:[]
}]
}, {
标签:“label3”,
家长:[]
}]
}];
//注意:需要使用集合来检索数据
//设置:
//sadd标签1标签2标签3
//sadd label2 label4
var=要求('lodash');
var async=require('async');
var redis=require('redis').createClient();
函数RedisTree(){}
/**
*从Redis迭代异步检索项目
*@param{String}标签名称(集合名称)
*@param{Function}f(err,arrayOfItems)
*/
雷迪
var t = new RedisTree();

// Save the sampleTree
t.save(sampleTree, function(err){
  // or ... retrieve it starting at "label1"
  t.load('label1', function(err, tree){
    console.log("sampleTree === ", JSON.stringify(tree, null, 1));
  });
});