为什么我的数组需要解析,当它们在控制台中看起来相同时?

时间:2014-04-15 07:39:18

标签: javascript arrays asp.net-mvc json d3.js

当我想到一个问题时,我正在研究D3组件。由于我正在使用不同的阵列,我想知道为什么他们需要不同的数据处理,当它们都包含相同的数据时。

第一种情况:我有一个'硬编码'数组,如下所示:

var tmp = [
    {
        "Weight": 0.0,
        "Speed": 59.9,
        "Depth": 362.24000,
        "Time": "2014-04-09T10:01:23",
        "Id": 0
    }, {
        "Weight": 10.0,
        "Speed": 59.9,
        "Depth": 394.07000,
        "Time": "2014-04-09T10:01:56",
        "Id": 1
    }];

或者,在Chrome控制台中进行检查时:

enter image description here

每当我使用此数组提供组件时,组件工作正常,并且所有线/轴都被正确绘制。

第二种情况:我使用d3.json从我的控制器获取一个数组,并在将其记录到控制台时返回以下内容:

[{"Weight":0.0,"Speed":59.9,"Depth":362.24000,"Time":"2014-04-09T10:01:23","Id":0},{"Weight":10.0,"Speed":59.9,"Depth":394.07000,"Time":"2014-04-09T10:01:56","Id":1}]

所以,每当我试图做json.foreach()时(json是控制器中数组的名称):

json.forEach(function(d) {
    var date = format(d.Time);
    d.Time = date;
});

启动foreach函数时出现以下错误: Uncaught TypeError: undefined is not a function

为了使其工作,我必须对我的控制器通过JSON.parse(json)返回的数据执行d3.json(),然后我的数组如下所示: enter image description here

我还应该提一下我的asp.net mvc控制器返回:

string json = JsonConvert.SerializeObject(Model.Trend.ToArray());

return Json(json, JsonRequestBehavior.AllowGet);

我知道从控制器返回的数组在检查时看起来像一串值,但我真的不明白为什么。

所以,我猜我的问题真的归结为这个; 为什么我的阵列" tmp"工作,但我用d3.json获取的数组需要在工作之前解析?

2 个答案:

答案 0 :(得分:0)

' tmp'运行脚本时,浏览器会为您解析数组。您可以在故意创建故障阵列时检查此项,例如在某处放置一个双括号。 您的浏览器会告诉您它并不了解您的需求' tmp'变量是。

但是,当您创建对MVC控制器的调用时,它事先并不知道该控制器期望的结果类型。也许稍后将在您的应用程序中调用的其他控制器将返回XML数据,这需要另一种解析方式。

从任何地方获取JSON数据的简便方法'是使用jQuery .getJSON方法。 这不需要额外的调用来解析数据。

另外,你的D3呼叫是什么样的?您声明了什么函数来处理回调?

答案 1 :(得分:0)

$.each(json, function (index, d) {
  var date = format(d.Time);
  d.Time = date;
});