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

あなたには2つの問題があると思います。

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

2 次元配列は必要ありません。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(および 0 に設定) し、 のhandleMenu代わりに使用しますsections

result[i++] = values;

また、result宣言を次のように変更します。

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