建立多维数组

时间:2012-10-25 23:30:25

标签: javascript node.js redis

我正在尝试使用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);
  });
}

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

1 个答案:

答案 0 :(得分:1)

我认为你有两个问题。

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

    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"]}
    

    您不需要二维数组。 sectionsresult的有序索引。您按顺序浏览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 = [];