2012-02-13 1 views
1

Я использую узел и redis в течение некоторого времени. Проблема, которую я испытываю, заключается в том, что когда я использую hgetall в redis, он возвращает объект.Javascript Convert Array to Object

{ uid: '6203453597', 
    first_name: 'Name', 
    last_name: 'Surname', 
    gender: 'male', 
    email: '[email protected]', 
    status: '1', 
    chips: '4002043' } 

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

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

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

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

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

Спасибо,

+0

Наверняка у вас нет проблем, просто получить доступ к элементам массива и присвоить его свойства объекта. Вы ищете встроенное решение? –

+0

* «Итак, важно, чтобы он был эффективным и автоматическим, а не ручным». * Единственный способ, которым это может быть ** автоматический **, - это если вы можете получить что-то, сообщающее вам, какие индексы массива сопоставляются с именами свойств. Если у вас нет возможности запросить это, вы не сможете сделать его «автоматическим». –

+0

@Felix, Да У меня нет проблем с этим, но у меня есть массив массивов. Итак, было бы лучше, если бы я мог каким-то образом привести схему и применить ее. Я ищу встроенное решение (или более легкое решение), как и функцию dataschema YUI, если она существует. – Merinn

ответ

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

EDIT: версия лучше всего подходит для вашего примера с multihmget вызовов. Использование

// 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); 
})); 
-2

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

var myarray = new Array(); 
for(var attrName in myobj){ 
    myarray.push(myobj[attrName]); 
} 
+0

Нет, он хочет преобразовать массив в объект. –

1

Использование функций подчеркивания pick и values, вы можете перейти от 1 до 2

_.values(_.pick({ uid: '6203453597', 
    first_name: 'Name', 
    last_name: 'Surname', 
    gender: 'male', 
    email: '[email protected]', 
    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"} 

 Смежные вопросы

  • Нет связанных вопросов^_^