2013-04-15 69 views
0

檢索動態變量我有一個js對象,看起來像這樣:如何從一個對象

  var detailsArray = [ 
           {a0 :1, 
            b0 :'A'}, 
           {a1 :2, 
            b1 :'B'}, 
           {a2 :3, 
            b2 :'C'}, 
           {a3 :4, 
            b3 :'D'}]; 

這是怎樣的對象從服務器端創建。在客戶端,我想檢索所有'a's的值並將它們添加到數組中。問題是變量名稱正在根據索引號發生變化。我曾嘗試使用underscore.js來做這樣的事情:

  var variableA = new Array(); 
      for(var i = 0;i<detailsArray.length;i++){ 
      var temp = 'a' + i; 
      variableA[i] = _.pluck(detailsArray,temp); 
      }    

但是這不起作用。任何人都可以告訴如何獲得值

回答

3

有兩種方法在JavaScript訪問對象的屬性:使用像你剛剛做了,或者使用數組語法風格。

var obj = {'a':5}; 

obj.a 
obj['a'] 
與您的代碼

那麼,這將給本:

var variableA = new Array(); 
for(var i = 0;i<detailsArray.length;i++){ 
    variableA[i] = detailsArray[i]['a' + i]; 
} 
+0

如果數組裏面的對象是不是在爲了你期待又是什麼?如果第一個房產從10開始怎麼辦?你不會有任何東西 – TheBrain

+0

我回應了作者所要求的,特別是關於這個: 「問題是變量名稱正在改變,這取決於索引號」 – Brugnar

0

這裏有一個可能的實現

var tmp = []; 
for (var i = 0; i < detailsArray.length; i++) { 
    var obj = detailsArray[i]; // current object at index 
    for (var props in obj) { // iterate properties in current object 
     if (props.charAt() == "a") { // if starts with a.... 
      tmp.push(obj[props]); // add value to array 
      break; // stop the property iteration and move to next object 
     } 
    } 
} 
console.log(tmp); // [1,2,3,4] 
0

你也可以那樣做:

for (var i = 0; i < detailsArray.length; i++) 
    alert(eval("detailsArray[" + i + "].a" + i)); 

我提供的代碼將對應alert所有的值就像在json數組中一樣,但顯然你可以用你想要的值來做任何事情。

在這裏,我認爲所有的鑰匙都是那種水平,但我認爲這是一個安全的假設。

+0

,這太可怕了。你爲什麼需要eval?你可以做'alert(detailsArray [i] ['a'+ i])''。不過實話說。不要那樣做 – TheBrain

+0

@TheBrain感謝您的反饋。爲什麼'eval'可怕?認真 - 我不是js的主人,可能我在這裏錯過了一些東西。 –

+0

@BorisStrandjev:在這種情況下,'detailsArray [i] ['a'+ i]'做同樣的工作,看起來更乾淨。一般來說,應該避免使用'eval',因爲它會讓調試變得更加困難,並且會引入可能的XSS風險。 – Blender

1

以下劃線,你可以這樣做:

_.reduce(_.map(detailsArray, function(o, i) { 
    return o['a' + i]; 
}), function(a, b) { 
    return a + b; 
}); 

並與本地JS在新的瀏覽器:

detailsArray.map(function(o, i) { 
    return o['a' + i]; 
}).reduce(function(a, b) { 
    return a + b; 
});