我正在尝试使用redis作为数据源构建一个带有node.js的多维数组。然而,我做得不对。
menuKey包含包含redis中有序集的键,有序集包含引用其他键的值。 e.g:
menu:main:sections contains ["menu:main:section1","menu:main:section2"]
menu:main:section1 contains ["option1", "option2"]
menu:main:section2 contains ["option1"]
我正在尝试构建的数组:
[["option1", "option2"], ["option1"]]
这是我的代码,但是我以某种方式错误地回调了?
function handleMenu(jsonrpc) {
var params = jsonrpc['params'];
var result = [];
var sections = [];
menuKey = 'menu:' + params['menu'] + ':sections';
async.series([
function (callback) {
redis.zrevrange(menuKey, 0, -1, function(err, sections) {
async.forEachSeries(sections, function(section, sectionCallback) {
redis.zrevrange(section, 0, -1, function(err, items) {
result.push(items);
sectionCallback();
});
}, callback);
});
}
], function() {
console.log(result);
});
}
我看不出我做错了什么,请指教。
答案 0 :(得分:1)
我认为你有两个问题。
试试这个:
function handleMenu(jsonrpc) {
var params = jsonrpc['params'];
var result = {}; // THIS LINE IS DIFFERENT
var sections = [];
menuKey = 'menu:' + params['menu'] + ':sections';
async.series([
function (callback) {
redis.zrevrange(menuKey, 0, -1, function(err, values) {
sections = values;
callback();
});
},
function (callback) {
async.forEachSeries(sections, function(section, cb) {
redis.zrevrange(section, 0, -1, function(err, values) {
result[section] = values;
cb();
});
}, callback);
}
], function() {
// result = sections; // <--- DON'T DO THIS
console.log(result);
});
}
在这种情况下,result
将如下所示:
{"menu:main:section1": ["option1", "option2"], "menu:main:section2": ["option1"]}
您不需要二维数组。 sections
是result
的有序索引。您按顺序浏览sections
并使用这些键提取保留二级订单的数组。像这样:
var i = 0,
j = 0,
section,
contents;
for(i = 0; i < sections.length; i++){
section = sections[i];
contents = result[section];
for(j = 0; j < contents.length; j++{
console.log(contents[j]);
}
}
更新:
如果必须拥有2D数组。然后在i
的顶部声明变量handleMenu
(并将其设置为0)并使用它代替sections
,如下所示:
result[i++] = values;
另外,将result
声明更改为:
var result = [];