2017-02-23 80 views
0

我想我已閱讀所有以前對任何類似問題的回答,但未找到答案。使用Javascript構建動態JSON結構

我想建立一個JSON結構,看起來像這樣(但更大:));

[{"APC": { 
    "Description": "", 
    "Data": "001,044,1064", 
    "Units": "", 
    "AbbrvUnits": "" 
} 
}, {"DATE": { 
    "Description": "", 
    "Data": 1487858497000, 
    "Units": "Date", 
    "AbbrvUnits": "" 
}}] 

但是我能得到的最接近的是這個數據結構;

[{ 
"DataItem": "APC", 
"DataVal": { 
    "Description": "", 
    "Data": "001,044,1064", 
    "Units": "", 
    "AbbrvUnits": "" 
} 
}, { 
"DataItem": "DATE", 
"DataVal": { 
    "Description": "", 
    "Data": 1487858497000, 
    "Units": "Date", 
    "AbbrvUnits": ""}}] 

與此javascript(節點紅色):

DataVal = { 
      'Description' : "", 
      'Data' : DataValue, 
      'Units' : UnitsStr, 
      'AbbrvUnits' : "" 
      }; 
outputJSON.push({'DataItem' : label, DataVal}); 

如果我嘗試:

outputJSON.push({label : DataVal}); 

我只是在所產生的結構,而不是它的價值得到 「標籤」。是否有可能獲得Javascript來擴展變量「標籤」並將其值放入?有一些聲明2個數據變量的例子可以做這樣的事情,但它們都有效地對聲明中的'label'值進行了硬編碼。然而,有很多'標籤'項目,所以我真的不想硬編碼它。它也會使我具有其他類似數據的通用性。

這是一個Javascript的限制還是我錯過了什麼?

回答

1

此:

outputJSON.push({'DataItem' : label, DataVal}); 

應該是這樣的:

var obj = {}; 
obj[label] = DataVal; 
outputJSON.push(obj); 

對象是key-value對,所以,在你的原代碼,你傳遞一個有DataItem和重點對象值爲label,並且由於JavaScript現在分析它解析的對象聲明的方式:

{DataVal} as {"DataVal":DataVal} 

編輯

這最後一部分(約{DataVal}是如何解析)是ECMAScript的2015年(簡寫屬性名稱),更可以Object Initializer下的MDN

可以讀到它
+0

輝煌。有效;我會更詳細地閱讀爲什麼。非常感謝。 – Brian

+0

這樣做仍然不能完全讓我滿意,因爲我已經結束了太多的對象層。爲了訪問數據,我需要使用msg/payload [0] .APC(因爲我已經完成了payload.msg = outputJSON)。我可以構造它,以便我可以簡單地使用payload.msg.APC? – Brian

+0

啊,不要使用推,因爲它是不必要的。如果項目'標籤'是唯一的,我可以將'obj'賦給msg.payload。得到它了。 – Brian

0

只是整理這件事。以Adam的回答,我結束了這個:

Var DataVal ={} 
// inside a loop of 'DataItems' assign key:value pairs where 
// the DataItem is a unique value 

DataVal[DataItem] = { 
     'Data' : DataValue, 
     'Units' : UnitsStr, 
     }; 

然後,我可以將此分配給節點紅色msg.payload。希望有人發現這一點,它可以幫助他們!