2017-01-09 64 views
0

我有一個數組名爲數據包含對象像這樣:如何在JavaScript對象中動態引用變量鍵名?

[{"timeslot":"6am-7am","Monday":5},{"timeslot":"7am-8am","Monday":0},{"timeslot":"8am-9am","Monday":10}] 

每個對象包含兩個鍵 - 值對。我需要創建兩個新的陣列:

  • 陣列,時隙 S,包含與「時隙」鍵
  • 陣列,NUMUSERS相關聯的每個值,包含與所述相關聯的每個整數值「週一」鍵

這裏是我的javascript:

var timeslots = []; 
var numUsers = []; 
var keys = Object.keys(data[0]); 
var today = keys[1]; 


for(var i in data) { 
    timeslots.push(data[i].timeslot); 
    numUsers.push(data[i].today); 
} 

的for循環第一線的工作原理,並且返回以下時隙陣列:

["6am-7am", "7am-8am", "8am-9am"] 

第二行,但是,返回未定義元件的陣列。

我的問題是,數組中數組中的對象的第二個鍵值有所不同。每個對象將包含一週中的同一天,但是這一天可以是「星期一」到「星期天」中的任何一個。

如何動態引用它?

回答

3

使用方括號表示法爲您i使用它您可以訪問相同的方式對象值:

numUsers.push(data[i][today]); 

注:但是,您的代碼有幾個非常重要的問題,最終會給您帶來錯誤。最明顯的一點是,您依賴於對象屬性的順序並使用Object.keys檢索一組鍵,將第二個鍵設置爲today變量的值。您的錯誤是,在不同的系統和瀏覽器中,像Object.keys(obj)[1]這樣的代碼可能會返回不同的結果,因爲JavaScript中的對象屬性沒有訂單。此外,您不應該使用for .. in語句來迭代數組,而是使用簡單的for (var i = 0, len = arr.length; i < len; i++)循環。最後,別忘了,data數組可能包含零項,因此您的代碼data[0]將引發錯誤。我建議你重新考慮應用程序的業務邏輯,並重新編寫它以使其更可靠。

+2

哇 - 這是比我想象的簡單。該睡了。 – Callum

+0

如果日子不同,這種解決方案將無法正常工作,除非您在迴路中設置「today」*。 –

+0

@ChrisG您的解決方案將無法正常工作。請閱讀我添加到答案的註釋。 – VisioN

1

你需要這樣的:

numUsers.push(data[i][Object.keys(data[i])[1]]); 
+0

爲什麼您認爲OP要使用除第一項「data」的第二個屬性之外的任何東西?他的代碼很有意義,而你的建議會扼殺最初的想法。 – VisioN

+0

因爲他在他的問題的最後一段專門說了這樣的話:「我的問題是[0123]」我的問題是「 –

+0

從我所看到的情況來看,他的意思是'data'數組可能有''Tuesday'',''星期三「等,但是一個」數據「只能有一個星期中的某一天。這就是爲什麼他在實際循環之前引入'today = keys [1]'。 – VisioN