我一直在使用node和redis。我遇到的问题是,当我在redis中使用hgetall时,它会返回一个对象。
{ uid: '6203453597',
first_name: 'Name',
last_name: 'Surname',
gender: 'male',
email: 'email@email.com',
status: '1',
chips: '4002043' }
但是,当我使用hmget并指定我想要获取的字段时,它会返回一个数组。
[ '6203453597', 'Name', 'Surname', '4002043' ]
所以,我想将数组转换为关联数组,就像第一个一样。从代码和性能方面转换它的最佳方法是什么。
我也在redis中使用multi命令。所以它在第一个例子中返回一个对象数组,在第二个例子中它返回一个数组数组。因此,重要的是要有效和自动,而不是手动。
YUI的dataschema功能正是我所寻找的。但是它需要在node.js上完成,我使用的唯一第三方实用工具是下划线。有没有简单的方法,或者我需要手动转换下摆。
谢谢,
答案 0 :(得分:3)
我已经构建了类似于你想要的东西,但是对于sort
命令。这适用于hmget
:
function getFieldsAsObject(key, fields, next) {
function mapResults(err, values) {
if(err)
return next(err);
var result = {};
for(var i = 0, len = fields.length; i < len; i++) {
result[fields[i]] = values[i];
}
next(null, result);
}
var args = [].concat(key).concat(fields).concat(mapResults);
client.hmget.apply(client, args);
}
编辑:通过multi
hmget
来电更适合您示例的版本。
// Call with an array of fields and a function(err, results) {}
function mapResults (fields, next) {
// Return a closure for a multi.exec call
return function (err, replies) {
if(err)
return next(err);
// Call next with no error and the replies mapped to objects
next(null, replies.map(mapFields));
};
function mapFields (reply) {
var obj = {};
for(var i = 0, len = fields.length; i < len; i++)
obj[fields[i]] = reply[i];
return obj;
}
}
样本用法:
var client = require("redis").createClient()
, multi = client.multi();
multi.hmget("a.1", "foo", "bar");
multi.hmget("a.2", "foo", "bar");
multi.exec(mapResults(["foo", "bar"], function(err, results) {
// results will be [{foo: 17, bar: 4711}, {foo: 42, bar: 3.1415926535897932384626433}]
console.log(results);
}));
答案 1 :(得分:1)
_.values(_.pick({ uid: '6203453597',
first_name: 'Name',
last_name: 'Surname',
gender: 'male',
email: 'email@email.com',
status: '1',
chips: '4002043' },"uid","first_name","last_name","chips"))
["6203453597", "Name", "Surname", "4002043"]
或object你可以从2变为1。
_.object(["uid","first_name","last_name","chips"],[ '6203453597', 'Name', 'Surname', '4002043' ])
{uid: "6203453597", first_name: "Name", last_name: "Surname", chips: "4002043"}
答案 2 :(得分:-2)
如果要将对象转换为数组很简单:
var myarray = new Array();
for(var attrName in myobj){
myarray.push(myobj[attrName]);
}