2014-06-16 145 views
0

我想从JSON对象中创建一个Javascript对象。这是因为我想用一个需要特殊数据集的.js插件制作图形。他需要下列对象数据:动态构建javascript对象

var data = { 
labels : ["January","February","March","April","May","June","July"], 
datasets : [ 
    { 
     fillColor : "rgba(220,220,220,0.5)", 
     strokeColor : "rgba(220,220,220,1)", 
     pointColor : "rgba(220,220,220,1)", 
     pointStrokeColor : "#fff", 
     data : [65,59,90,81,56,55,40] 
    }, 
    { 
     fillColor : "rgba(151,187,205,0.5)", 
     strokeColor : "rgba(151,187,205,1)", 
     pointColor : "rgba(151,187,205,1)", 
     pointStrokeColor : "#fff", 
     data : [28,48,40,19,96,27,100] 
    } 
] } 

和我的JSON对象看起来像这样(不介意的数据,它的测试数据)。我的JSON对象没有问题。已通过一些JSON验证在线:

{ "Metingen": [ 
    { 
     "Temp": "25.00", 
     "Humy": "37.40", 
     "Time": [ 
      { 
       "Uur": "22", 
       "Minuut": "32", 
       "Second": "15", 
       "Dag": "15", 
       "Maand": "06", 
       "Jaar": "2014" 
      } 
     ] 
    }, 
    { 
     "Temp": "25.00", 
     "Humy": "37.20", 
     "Time": [ 
      { 
       "Uur": "22", 
       "Minuut": "32", 
       "Second": "15", 
       "Dag": "15", 
       "Maand": "06", 
       "Jaar": "2014" 
      } 
     ] 
    } ] } 

所以我需要把所有标签的“达格”的价值观,数据集[0]。数据所需要的“温度”和数据集1。数据需要“Humy “来自我的JSON对象的值。但是,我该如何动态地做到这一点?因为Temp和Humy值的数量会随着每次页面刷新而改变。我已经尝试过,但这不起作用。 (我已经离开了Humy数据集在这里简化它

var dataBuilder = new Object(); 

for(i = 0; i < objs.Lijnen;i++) { 
    dataBuilder.labels[i] = objs.Metingen[i].Time[0].Dag; 
    dataBuilder.datasets[0].data[i] = objs.Metingen[i].Temp; 
} 
dataBuilder.datasets[0].fillColor = "rgba(220,220,220,0.5)"; 
dataBuilder.datasets[0].strokeColor = "rgba(220,220,220,1)"; 
dataBuilder.datasets[0].pointColor = "rgba(220,220,220,1)"; 
dataBuilder.datasets[0].pointStrokeColor = "#fff"; 

但后来我得到一个上线4 “无法设置属性‘0’的未定义”我也尝试了以下几件事:

for(i = 0; i < objs.Lijnen;i++) { 
    dataBuilder[labels][i] = objs.Metingen[i].Time[0].Dag; 
    dataBuilder[datasets][0][data][i] = objs.Metingen[i].Temp; 
} ... (code omitted) 

我读的地方,JavaScript对象仅仅是数组的数组,但这并不因为“标签”,“数据集”和“数据”是不确定的工作逻辑,所以我想这一个还有:

for(i = 0; i < objs.Lijnen;i++) { 
    dataBuilder["labels"][i] = objs.Metingen[i].Time[0].Dag; 
    dataBuilder["datasets"][0]["data"][i] = objs.Metingen[i].Temp; 
} (code omitted) 

但在这里我也遇到了一个错误。我检查了objs.Metingen [i] .Time [0] .Dag和objs.Metingen [i] .Temp,他们的工作很完美。所以,任何人都知道如何将我的JSON数据解析为Graph插件所需的数据库?也许JQuery? (有关Graph plugin is here的更多信息)对不起,很长的文章。

回答

0

有几个问题与你的第一个代码:

  1. 对象dataBuilder不正确初始化,考虑到你以后使用它的方式。考虑这个代码也导致“无法设置属性‘0’的未定义”:

    obj = Object(); 
    obj.array[0] = 1000; 
    

    在上面的,obj是确实是一个对象,它可以有一个属性命名为“阵”,但该属性尚不存在 - 因此,你不能分配任何东西给它的'0'成员(因为它还不是一个数组,在这一点上,它是“未定义的”)。适当的例子:

    obj = Object(); 
    obj.array = Array(); 
    obj.array[0] = 1000; 
    

    或者,更简单:

    obj = {array: []}; 
    obj.array[0] = 1000; 
    

    这创建具有属性 “阵列”,其为空数组的对象。

  2. 假设objs.Lijnen是一个对象,“i < objs.Lijnen”总是错误的。您可能需要的是“objs.Lijnen.Metingen.length”或“objs.Metingen.length”(不确定objs.Lijnen是否为Metingen的拼写错误或父对象)。

  3. 假设Lijnen不是一个错字,它是Metingen的父母,您需要将objs.Metingen更改为objs.Lijnen.Metingen。

工作代码:

var obj = {Lijnen: JSON.parse(YOUR_JSON_STRING) }; 

... 

var dataBuilder = {labels: [], datasets: []}; // properly initialized object 

for(i = 0; i < objs.Lijnen.Metingen.length;i++) { // .length 
    dataBuilder.labels[i] = objs.Lijnen.Metingen[i].Time[0].Dag; 
    if (!dataBuilder.datasets[0]) dataBuilder.datasets[0] = { data: [] }; 
    dataBuilder.datasets[0].data[i] = objs.Lijnen.Metingen[i].Temp; 
} 
dataBuilder.datasets[0].fillColor = "rgba(220,220,220,0.5)"; 
dataBuilder.datasets[0].strokeColor = "rgba(220,220,220,1)"; 
dataBuilder.datasets[0].pointColor = "rgba(220,220,220,1)"; 
dataBuilder.datasets[0].pointStrokeColor = "#fff"; 
+0

奥凯,得到它现在的工作,我刚换了“VAR dataBuilder ......”行到你现在的数据分析程序没有问题! – Reggi

+0

快速问题,当我想要更多然后1个数据集时怎么办?因为当我调用数据集[1]时,我得到相同的错误。 – Reggi

+0

我在上面的“if”行中首次使用它时编辑了分配数据数组的代码 – fstanis