0

我正在尝试使用 redis 作为数据源使用 node.js 构建一个多维数组。但是,我做得不对。

menuKey 包含包含 redis 中排序集的键,排序集包含引用其他键的值。例如:

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);
  });
}

我看不出我做错了什么,请指教。

4

1 回答 1

1

我认为你有两个问题。

  1. 您需要一个 javascript 对象而不是数组作为您的顶级容器
  2. 你似乎在最后覆盖了你的结果

尝试这个:

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]);
    }
}

更新:

如果绝对必须有一个二维数组。i然后在顶部声明一个变量(并将其设置为 0)handleMenu并使用它代替sections,如下所示:

result[i++] = values;

另外,将result声明改回如下:

var result = [];
于 2012-10-26T05:12:48.457 回答