Javascript Конвертировать массив в объект - PullRequest
1 голос
/ 13 февраля 2012

Я уже давно использую node и redis.Проблема, с которой я сталкиваюсь, заключается в том, что когда я использую hgetall в redis, он возвращает объект.

 { uid: '6203453597',
    first_name: 'Name',
    last_name: 'Surname',
    gender: 'male',
    email: 'email@email.com',
    status: '1',
    chips: '4002043' } 

Однако, когда я использую hmget и указываю поля, которые хочу получить, он возвращает массив.

[ '6203453597', 'Name', 'Surname', '4002043' ]

Итак, я хотел бы преобразовать массив в ассоциативный массив, как и первый.Каков наилучший способ преобразовать его из кода и производительности?

Я также использую команду multi в redis.Таким образом, в первом примере он возвращает массив объектов, а во втором - массив массивов.Поэтому важно быть эффективным и автоматическим, а не ручным.

Функция обработки данных YUI - это то, что я ищу.Однако это нужно сделать в файле node.js, и единственный используемый мной сторонний инструмент - это подчеркивание.Есть ли простой способ сделать это, или мне нужно конвертировать Подол в цикле, вручную.

Спасибо,

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

Я создал нечто похожее на то, что вы хотите, но для команды 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 голос
/ 16 апреля 2014

Используя функции Underscore выберите и значения , вы можете перейти от 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"}
0 голосов
/ 13 февраля 2012

, если вы хотите преобразовать объекты в массив, просто:

var myarray = new Array();
for(var attrName in myobj){
    myarray.push(myobj[attrName]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...