2014-11-24 101 views
0

我试图从REST API中的JSON文件中检索数据。我正在使用Morris js创建一个简单的条形图。我很难弄清楚如何正确地格式化javascript数组。将值从JSON移到javascript数组

该图表这样产生:

Morris.Bar({ 
    element: 'myfirstchart', 
    data: [ 
     { year: '2008', value: 20 }, 
     { year: '2009', value: 10 }, 
     { year: '2010', value: 5 }, 
     { year: '2011', value: 5 }, 
     { year: '2012', value: 20 } 
    ], 
    xkey: 'year', 
    ykeys: ['value'], 
    labels: ['Series A'] 
}); 

我一直试图保存在变量从JSON结构值:

var USD = data.d.results[0].ExchangeCross; 
var USD2 = data.d.results[0].ApprovedRate; 

为了将它们添加到我尝试添加图表他们这样的阵列:

var obj = { year: USD, value: USD2 }; 

然后将data:[]更改为data:obj。这不起作用。最佳解决方案是对我需要的所有值运行each函数,然后将它们绘制到图表中。

编辑forEach function

$(document).ready(function() { 
    $.ajax({ 
     url: "http://intra.site.com/_vti_bin/ListData.svc/ExchangeRates?$orderby=Modified%20desc", 
     headers: { 'accept': 'application/json;odata=verbose', 'content-type': 'application/json;odata=verbose'}, 
     success: function(data){ 
        var params = { 
         element: 'myfirstchart', 
         data: [], 
         xkey: 'year', 
         ykeys: ['value'], 
         labels: ['Series A'] 
            }; 

         var data = JSON.parse(data); 

         data.d.results.forEach(function(element) { 
         var obj = { "year": element.ExchangeCross, "value": element.ApprovedRate }; 
         params.data.push(obj); 
        }); 

        Morris.Bar(params); 

           } 
      }); 
    }); 

回答

1

你必须加载数据收到JSON API从进入你莫里斯图。你通过循环你的JSON,创建一个对象并将它们推入一个数组。

假设这是您收到的JSON:

var jsonString = '{"d": {"results": [{"ExchangeCross": "2010", "ApprovedRate": "20"}, {"ExchangeCross": "2011", "ApprovedRate": "5"}, {"ExchangeCross": "2012", "ApprovedRate": "15"}, {"ExchangeCross": "2013", "ApprovedRate": "35"}, {"ExchangeCross": "2014", "ApprovedRate": "10"}]}}'; 

创建一个params对象与你莫里斯图表使用,具有data为空数组:

var params = { 
    element: 'myfirstchart', 
    data: [], 
    xkey: 'year', 
    ykeys: ['value'], 
    labels: ['Series A'] 
}; 

解析您的JSON(如果你有一个字符串):

var data = JSON.parse(jsonString); 

遍历results阵列上缠绕有d中,创建一个兼容的对象与你需要的对象插入到params.data数组中的值,并推:

data.d.results.forEach(function(element) { 
    var obj = { "year": element.ExchangeCross, "value": element.ApprovedRate }; 
    params.data.push(obj); 
}); 

打电话给你Morris.Barparams

Morris.Bar(params); 

+0

这似乎不起作用,我不确定数据是否正确解析。我将编辑最初的帖子以包含您的建议。 – TietjeDK 2014-11-24 08:11:47

+0

不,在这种情况下,只需删除'var data = JSON.parse(data);'行。因为你已经有了解析的json。 – Abhitalks 2014-11-24 08:15:26

+0

Thx一堆!这很好用! – TietjeDK 2014-11-24 08:16:31

0

如果我理解你,你要更换你传递给莫里斯酒吧功能JS对象的data一部分?您需要创建一个数组而不是一个对象。

尝试这样:

var USD = data.d.results[0].ExchangeCross; 
var USD2 = data.d.results[0].ApprovedRate; 

var dataArray = []; 

// push each item into the array 
dataArray.push({year: USD, value: USD2}); 

Morris.Bar({ 
    element: 'myfirstchart', 
    data: dataArray, 
    xkey: 'year', 
    ykeys: ['value'], 
    labels: ['Series A'] 
}); 
+0

Thx - 正是我在找的东西。如果我想添加多个值,该怎么办?会是类似'dataArray.push({year:USD,value:USD2},{year:SGD,value:SGD2})'? – TietjeDK 2014-11-24 07:55:20

+0

'push'只是将一个元素添加到数组中。如果你想添加多个元素,你可以在创建数组时使用它。例如'dataArray = [{year:USD,value:USD2},{year:SGD,value:SGD2}];' – jasonscript 2014-11-24 08:09:47