2012-02-13 29 views
1

私はしばらくノードとredisを使用しています。私が経験している問題は、redisでhgetallを使うと、オブジェクトを返します。Javascriptオブジェクトを配列に変換する

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

ただし、hmgetを使用して取得するフィールドを指定すると、配列が返されます。

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

このように、配列を最初の配列と同様に連想配列に変換したいと思います。コードとパフォーマンスを賢明に変換する最も良い方法は何ですか?

私はredisでmultiコマンドも使用しています。したがって、最初の例ではオブジェクトの配列を返し、2番目の例では配列の配列を返します。したがって、手動ではなく効率的で自動であることが重要です。

私はYUIのdataschema関数を探しています。しかし、それはnode.jsで行う必要があり、使用している唯一のサードパーティのユーティリティツールはアンダースコアです。これを行う簡単な方法はありますか、手動でループ内の裾を変換する必要がありますか?

おかげで、

+0

に行くことができます。組み込みのソリューションをお探しですか? –

+0

* "効率的で自動で手動ではなく、自動であることが重要です。" **自動**になる唯一の方法は、配列インデックスがどのプロパティ名にマップされているかを示すことができる場合です。それを照会する方法がない限り、それを「自動」にすることはできません。 –

+0

@Felix、はい私は配列の配列を持っているが、私はそれを行うには何の問題はありません。ですから、何とかスキーマを与えてそれを適用できるといいでしょう。私はYUIのdataschema関数のように、それが存在すれば(またはより簡単なソリューション)組み込みのソリューションを探しています。 – 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

あなたは配列にオブジェクトを変換したい場合は単純です:下線機能pickvaluesを使用して

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

いいえ、彼は配列をオブジェクトに変換したいと考えています。 –

1

、あなたは2

に1から行くことができます
_.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"} 
関連する問題