使用node.js从redis获取分层数据
我希望有人能用这个来救我。由于某些原因,我无法在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: [
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时,这些调用将返回并开始组合对象
函数获取父对象(名称、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));
});
});