【问题标题】:building multi dimensional array构建多维数组
【发布时间】:2012-10-28 05:19:01
【问题描述】:

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

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

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

【问题讨论】:

  • 也许你需要的是一个对象而不是一个数组,而且语法看起来不对...["menu:main:section1": ["option1", "option2"] ??
  • 我非常肯定我需要一个多维数组。是的,语法可能是错误的,我是这个 node.js 的新手。我试图让数组 [0] [0] = 'a',数组 [0][1] = 'b',数组 [1][0] = 'c'。如果你明白我的意思。
  • 如果你的索引是一个字符串,你需要一个对象。如果您的索引是隐式整数,则需要一个数组。 { "prop1" : [ index0, index1 ], "prop2" : [ index0 ] }(在此格式中,属性名称周围的引号是可选的)
  • 好吧,我想要的是一个多维数组,所以我可能需要使用一个 int 索引。我使用 zrevrange 的原因是我希望“部分”在排序的 redis 集中按“排名”的顺序排列,并且这些“部分”应该包含“项目”,这些“项目”也是对哈希的引用,也按排名顺序。我想返回每个部分中的部分和项目的顺序。稍后我将在调用中检索哈希值。
  • 一个多维数组看起来像array = [ [ index0, index1 ], [ index ] ]。如果你想以某种方式映射"menu:main:section1" -> 0"menu:main:section2" -> 1,那就去吧。但是如果你想说array["menu:main:section1"][0] = "a";,那么你在外面使用一个对象,一个数组作为属性的值。对象还支持基于 int 的属性名称,但在包括 V8 在内的大多数引擎中都会遭受少量字符串转换 (0 -> "0") 损失。

标签: javascript node.js redis


【解决方案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"]}

您不需要二维数组。 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]);
    }
}

更新:

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

result[i++] = values;

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

var result = [];

【讨论】:

  • 我现在看到我一直将结果用作哈希图(或对象),这不是我的意图。我更新了重写为数组的问题。问题依然存在。我放错了回调?
猜你喜欢
  • 2014-07-07
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2012-08-01
  • 2023-03-21
相关资源
最近更新 更多