2012-05-14 24 views
-2

如果我有數組:如何訪問javascript對象的多個屬性?

my_array = [{a:3,b:4,c:7},{a:5,b:8,c:6}] 
property_names = ["a","c"] 

如何使用property_names陣攻擊my_array得到下面的輸出?:

subset_array = [[3,7],[5,6]] 
+2

爲了得到更好的答案,你應該提供更多的上下文:爲什麼你需要一個數組元素的子集,以及如何確定所需的屬性? – Sirko

+0

好吧,對不起,我不清楚。 – nachocab

+0

@nachocab更新帖子本身。 – 2012-05-14 14:50:41

回答

9
var my_array = [{a:3,b:4,c:7}, {a:5,b:8,c:6}]; 
var keys = ['a', 'c']; 

my_array.map(function(d){ 
    return keys.map(function(k) { 
     return d[k]; 
    }); 
}); 

這會給你[[3, 7], [5, 6]],似乎是剛你想要什麼。


[過時的初始答案;之前OP更新了他的問題]

使用o.ao.c - 沒有魔法參與,也沒有傷害小貓!

您也可以使用[]語法:o['a']o['c'] - 但通常只有當您要訪問一個動態屬性名稱(即一個變量,而不是[]內引號字符串)


使用

如果你想與這兩個值的數組:

var a_and_c = [o.a, o.c]; 

現在你可以使用a_and_c[0][1]訪問這兩個值。

+3

爲小貓+1。 –

+3

來吧,給我們展示一種神奇!就像在同一時間訪問'a'和'c'一樣!或從對象中提取一隻小貓。 – gdoron

+0

有沒有辦法不手動添加它們?如果我在對象中有一百個屬性呢? – nachocab

4

您可以通過兩種表示法訪問屬性:

無論o.ao.co['a']o['c']


編輯

如果你想創建一個包含兩個值的新數組,然後就這樣做使用,例如,通過@Reid建議代碼:

[o.a, o.c] 

2nd編輯

因此,只需在map函數中構建您的陣列,如下所示:

var filter = [「a」,「c」,「f」,「zzz」]; //應該

subset_array = my_array.map(函數(V){ VAR newArr = [];

for(var i=0; i<filter.length; ++i) { 
    if (typeof v[ filter[i] ] !== 'undefined') { 
    newArr.push(v[ filter[i] ]); 
    } 
} 

return newArr; 

});

但需要注意的是,只要使用原始類型(如示例中的int值),上面的代碼將克隆屬性。這意味着,如果您在某個點更改了my_array中的某個值,則subset_array將會而不是被隱式更改,但您必須重新創建subset_array或在此處調整值。

+0

我怎樣才能讓他們在一個數組,同時[5,6]? – nachocab

+3

@nachocab:'[o.a,o.c]' – Reid

1

這不是一個完整的答案,但我相信這將是有用的:

var values = [] 
var obj = {a: 1, b: 2, c: 3} 
for (var prop in obj) { 
    if (obj.hasOwnValue(prop)) { // skip props in [[prototype]], no effect here 
    values.push(obj[prop]) 
    } 
} 
values // -> [2, 1, 3] (in SOME UNDEFINED ORDER) 

要點:

  1. 迭代[全部]對象屬性名稱爲對象(而不是[ [原型]]鏈
  2. 從屬性名稱動態訪問值
  3. 屬性爲未訂購;如果需要,則排序values,例如

例如,這可以被擴展爲添加不同的「排除」規則。它也可以適應不同的高階函數。

快樂編碼。