动态构建javascript对象

时间:2014-06-16 09:42:07

标签: javascript jquery json plugins

我试图从JSON对象创建一个Javascript对象。这是因为我想用一个需要一组特殊数据的.js插件制作图表。他需要以下对象作为数据:

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"
            }
        ]
    } ] }

所以我需要在标签中加入所有" Dag"值,数据集[0] .data需要" Temp"和数据集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";

然后我得到了一个&#34;无法设置属性&#39; 0&#39;未定义&#34;在第4行。 我还尝试了以下方法:

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对象只是数组的数组,但这是逻辑,它不起作用,因为&#34;标签&#34;,&#34;数据集&#34;和&#34;数据&#34;未定义。所以我也试过这个:

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的更多信息)很抱歉这篇长篇文章。

1 个答案:

答案 0 :(得分:0)

您的第一个代码有几个问题:

  1. 考虑到以后使用它的方式,对象dataBuilder未正确初始化。考虑这个代码也导致&#34;无法设置属性&#39; 0&#39;未定义&#34;:

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

    在上面,obj确实是一个对象,它可以有一个名为&#34; array&#34;的属性,但该属性尚不存在 - 因此,你不能为它的&#39; 0&#分配任何东西39; member(因为它在那时还不是一个数组,它是&#34; undefined&#34;)。正确的例子:

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

    或者,更简单:

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

    这将创建一个具有属性&#34; array&#34;的对象。这是一个空数组。

  2. 假设objs.Lijnen是一个对象,&#34; i&lt; objs.Lijnen&#34;总是假的。你可能想要的是&#34; objs.Lijnen.Metingen.length&#34;或&#34; objs.Metingen.length&#34; (不确定objs.Lijnen是否是一个拼写错误或是Metingen的父对象)。

  3. 假设Lijnen不是拼写错误并且是Metingen的父母,则需要将objs.Metingen更改为objs.Lijnen.Metingen。

  4. 工作代码:

    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";