2017-02-23 83 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。希望有人发现这一点,它可以帮助他们!