2016-11-09 26 views
1

我有一個對象:選擇從對象給出的屬性值代入陣列

person = { 
    birth_year: 1970, 
    first_name: "John", 
    last_name: "Doe", 
    occupation: "Doctor", 
    city: "Boston", 
    married: true 
} 

我有鑰匙的名字在給定的順序數組:

keys = ["occupation", "last_name", "city"] 

我想這個數組:

["Doctor", "Doe", "Boston"] 

重要的是,答案應該保證順序(JavaScript不保證對象迭代的順序)。

我認爲在lodash /下劃線中可能有一些實用功能可以簡單地實現,但無法找出任何問題。

回答

4

您可以使用Array.prototype.map。通過數組映射循環,並通過對每個項目應用函數來創建一個新數組。當您使用keys數組作爲起點,並返回該鍵的o的值時,您將獲得一個僅包含值的新數組。

使用「動態」鍵名稱時,可以使用object[stringKeyName]表示法檢索值。

var o = { 
 
    birth_year: 1970, 
 
    first_name: "John", 
 
    last_name: "Doe", 
 
    occupation: "Doctor", 
 
    city: "Boston", 
 
    married: true 
 
}; 
 

 
var keys = ["occupation", "last_name", "city"]; 
 

 
var result = keys.map(function(k) { return o[k]; }); 
 

 
console.log(result);

如果它適合你的風格,你可以創建一個輔助方法來代替匿名函數:

var o = { birth_year: 1970, first_name: "John", last_name: "Doe", occupation: "Doctor", city: "Boston", married: true }; 
 
var keys = ["occupation", "last_name", "city"]; 
 

 
var prop = obj => key => obj[key]; 
 
var result = keys.map(prop(o)); 
 

 
console.log(result);

+0

我們甚至可以簡化成'變種結果此= keys.map(K => 0 [K])',但我還是不喜歡它。 –

+0

如果是風格問題,你可以將一些東西包裝在幫手中。看看第二個片段。 – user3297291

+0

如果順序很重要,這個或'_.map'函數是要走的路。 –

3

隨着Lodash你可以使用pickvalues

var o = { 
 
    birth_year: 1970, 
 
    first_name: "John", 
 
    last_name: "Doe", 
 
    occupation: "Doctor", 
 
    city: "Boston", 
 
    married: true 
 
} 
 
var keys = ["occupation", "last_name", "city"]; 
 

 
var result = _.values(_.pick(o, keys)); 
 
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

+0

不錯的一個...... – Mahi

+0

它保證順序嗎? –

+0

@Mikhail Batcer我不確定。 –