2016-05-13 66 views
2

我遇到了一个问题,其中我有一个IEnumerable<string>标签和一个IEnumerable<double[]>数据在我的MVC模型对象中,我想用Chartjs绘制这些值。在Chartjs中使用JavaScript在IEnumerable中迭代

我将两者都传递给我的javascript函数,我试图绘制图表。

的Chartjs语法是这样的,我想,在效果:

var data = { 
       ... chart info e.g. colors, etc. 
       datasets: [ 
        { 
         label: labels[0], // My first label 
         data: datas[0] // My first double[] 
        }, 
        // Repeat for each data/label combo 
        { 
         label: labels[n], // My n-th label 
         data: datas[n] // My n-th double[] 
        } 
       ] 
      }; 

由于我的两个集合,我怎么能适当地提取在其中的信息?很明显,这些集合的长度必须相同,因为存在一对一关联。我曾尝试将它们梳理成一个Tuple,但我认为这会让它在js方面变得更加复杂。

还是有人知道一个更简单的方法来实现与ChartJS相同的最终结果?

我很喜欢C#,但Javascript对我而言是新的。

+1

可以随时[zip](https://msdn.microsoft.com/en-us/library/dd267698(v = vs.100).aspx)这两个集合,然后使用[JavaScriptSerializer](https:/ /msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx)。 – apokryfos

回答

0

您当然可以将元组发送到客户端,并使用java-script轻松分割它。你可以做一个简单的ajax调用来将你的元组作为一个Json对象,然后将它分成两个数组。这些数组可以用于chart.js标签和数据点。

$.ajax({ 
    url: 'AjaxCall/getChartObjects', 
    dataType: 'json', 
    data: {}, 
    success: function (data) { //data here being the tuple recieved from server 
     //receive the tuple as a single Json object and split it up easily with some seperate arrays 
     dblArray= [] 
     $.each(data.Item1, function (index, value) { 
      dblArray.push(value.text); //label array 
     } 
     descArray= [] 
     $.each(data.Item2, function (index, value) { 
      descArray.push(value.dblTxt); //data array 
     } 
    }, 
    error: function (xhr, status, error) { 
     console.log('Error: ' + error.message); 
    } 
}); 

从控制器发送元组会是这样的:

//tuple sends two objects together- both job arrays will be seperated 
//and used in observables on client side 
var chartObjects = Tuple.Create(chartData, chartLabel); 

return Json(chartObjects, JsonRequestBehavior.AllowGet); 

你会再有,你需要在图表属性放置阵列:

var barChartData = { 
       labels: descArray, //array labels 
       datasets: [ 
        { 
         type: "Bar", 
         strokeColor: "black", 
         pointColor: "rgba(220,220,220,1)", 
         pointstrokeColor: "white", 
         data: dblArray, 

        } 
       ] 
      } 

我猜我不完全确定这是否是你想要的。如果您有任何问题,请告诉我。

+0

感谢您的建议。我想也可以传入多个元组,使得我在'var barChartData'的'datasets'设置中有许多'{...}'。你知道我将如何遍历JS中的元组枚举吗? –

+0

如果你通过列表​​,枚举,数组或其他任何东西,JavaScript不关心。您传递给客户端作为Json对象的对象将在javascript中处理。我想我不完全明白你在问什么。你可以使用for循环在JS中循环对象,或者像上面用jquery $ .each循环做的那样。 – MUlferts