Javascript将数组转换为对象

时间:2012-02-13 12:36:47

标签: javascript node.js redis

我一直在使用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上完成,我使用的唯一第三方实用工具是下划线。有没有简单的方法,或者我需要手动转换下摆。

谢谢,

3 个答案:

答案 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)

使用下划线功能pickvalues,您可以从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"]

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