Javascript将数组转换为对象
我一直在使用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上完成,我使用的唯一第三方实用工具是下划线。 有没有这样做的简单方法,或者我需要手动转换一个循环下摆。
谢谢,
我已经build立了类似于你想要的东西,但对于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); }));
使用下划线functionselect和值 ,你可以从1到2
_.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"]
或与对象,你可以从2到1。
_.object(["uid","first_name","last_name","chips"],[ '6203453597', 'Name', 'Surname', '4002043' ]) {uid: "6203453597", first_name: "Name", last_name: "Surname", chips: "4002043"}
如果你想将对象转换成数组很简单:
var myarray = new Array(); for(var attrName in myobj){ myarray.push(myobj[attrName]); }