将数组映射到对象

时间:2013-11-14 01:36:14

标签: javascript json node.js redis

我正在使用HMGET检索redis哈希键的多个字段,只需使用JSON发送它们:

redis.HMGET('key', 'name', 'date', // a lot more fields here,
    function(err, reply){
        res.jsonp({
            name: reply[0],
            date: reply[1],
            // other fields
        });
    }
);

使用大量字段会导致列表很长,因此代码可读性较差。所以我想知道:有没有更美观和常见的方法将reply数组映射到JSON响应对象 - 最好不必两次写下字段名称?

2 个答案:

答案 0 :(得分:0)

你可以通过使用HMGET的包装函数来处理这个问题,如下所示:

function localHMGET(key, res, fieldsArray) {
  var args = [key].concat(fieldsArray);
  args.push(function(err, reply) {
    var json = {};
    for (var i = 0; i < fieldsArray.lenth; i++) {
      json[fieldsArray[i]] = reply[i];
    }
    res.jsonp(json);
  });
  redis.HMGET.apply(this, args);
}

然后可以通过以下方式调用:

localHMGET('key', res, ['name', 'date' /* More fields */] );

我不知道这是否真的是你正在寻找的,但它将完成工作(如上所述)。这将手动创建GET调用的参数,并通过隔离GET中使用的键,您可以依赖它们将参数解压缩为'res'(我假设这是一个预定义的对象)。

答案 1 :(得分:0)

我不清楚你是否正在获取哈希的所有属性,在这种情况下你应该使用返回一个对象的hgetall。否则,您希望界面看起来像这样:

hmgetObject(redis)('key', 'name', 'date', ..., function (err, reply) {
  // Here, reply is already an object

  res.jsonp(reply);
});

您将注意到如何通过这样的redis客户端可以轻松地重用该功能:

var hmget = hmgetObject(redis);

hmget('key1', 'name', 'date', ...);
hmget('key2', 'foo', 'bar', ...);

这是实现,它是通用的,适用于任意数量的参数):

function hmgetObject (redis) {

  return function () {

    var args = [].slice.call(arguments, 0),
        cb = args.pop();

    args.push(map(args.slice(1), cb));
    redis.hmget.apply(redis, args);
  }

  function map (props, cb) {

    return function (err, vals) {

      if(err) return cb(err);

      var obj = {};
      for(var i = 0, l = props.length; i < l; i++) {
        obj[props[i]] = vals[i];
      }

      cb(null, obj);
    }
  }
}