2

我正处于学习 javascript 的新手阶段。我制作了一个 API,它可以获取在某个日期注册的一些用户,并将这些数据作为 JSON 对象返回。这是该数据的示例

{"myjsonobject": [{"users": 3, "joined": "2013-05-25"}, {"users": 1, "joined": "2013-05-26"}, {"users": 1, "joined": "2013-05-30"}, {"users": 1, "joined": "2013-05-31"}]}

然后我使用下面的 javascript 函数解析ChartJS linegraph上的数据和图形

$(document).ready(function()
{
url = "http://mylink/getjson/"
Create_jsonObject(url)
});

function Create_jsonObject(url) {
$.getJSON(url, function (data) {

myJSONObject=data;
var dataSource=myJSONObject.myjsonoject;
var chart = $("#chartContainer").dxChart({

    dataSource: dataSource,

    commonSeriesSettings: {

         argumentField: 'joined'

    },

    series: [

        { valueField: 'users', name: 'users' },

    ],

    argumentAxis:{

        grid:{

            visible: true

        }

    },

    tooltip:{

        enabled: true

     },

     title: 'Volunteer Registration',

     legend: {

        verticalAlignment: 'bottom',

        horizontalAlignment: 'center'

     },

    commonPaneSettings: {

        border:{

            visible: true,

            right: false

        }       

    }

 });


});
};

该函数用于在折线图上绘制 JSON 数据。我想合并一个 javascript 函数来检查缺少的日期并在缺少日期的地方插入 0 个用户。因此,该图将在未返回日期的情况下绘制零。它应该根据返回的最早日期检查这一点。有什么想法吗?

谢谢

4

4 回答 4

3

如何填充描述范围的数组中的缺失元素

假设起始数组已经排序,您可能希望将源数组中的第一个元素复制到一个新元素中,然后迭代地将“默认对象”推送到目标数组中,或者在存在匹配对象时从源数组中复制。重复直到你到达你的范围的尽头。

要检查是否存在匹配的对象,您可能希望首先通过要迭代的任何参数(在您的情况下:“joined”字段)来索引源数组。这意味着该参数必须是唯一的。

function getIndex(srcArray, field) {
    var i, l, index;
    index = [];
    for(i = 0, l = srcArray.length; i < l; i++) {
        index[srcArray[i][field]] = srcArray[i];
    }
    return index;
}

这将创建您的数组的哈希图。通过它的键(在你的情况下是“joined”字段)搜索一个元素非常简单:

if(index['2013-06-05'] !== undefined) { 
    /* the element indexed by "2013-06-05" exists */ 
}

现在你有了一个索引,你可以迭代你期望的范围。为此,获取源数组中的第一个和最后一个日期:

//get boundaries
var first = new Date(src[0].joined);
var last = new Date(src[src.length-1].joined);

您还需要知道如何构造默认对象:

function createDefault(datestr) {
    return {users: 0, joined: datestr};
}

现在声明一个目标数组并遍历范围:

var dest = [];
for(var d = first; d.getTime() <= last.getTime(); d.setDate(d.getDate()+1)) {
    datestr = dateToYMD(d); //dateToYMD is a helper function I declared that formats a date
    if(index[datestr]) {
        //this date exists in your data, copy it
        dest.push(index[datestr]);
    } else {
        //this date does not exist, create a default
        dest.push(createDefault(datestr));
    }
}

我制作了一个将目标数组记录到控制台的 jsfiddle。 http://jsfiddle.net/uNasR/

于 2013-06-06T08:27:33.893 回答
0

试试这个:

function fixDate(data)
{
    var myObjects=JSON.parse(data);

    for(var i=0;i<myObjects.length;i++)
    {
      if(!myObjects[i].joined)
         myObjects[i].joined="0";

    }
    return myObjects;
}
于 2013-06-06T07:42:47.830 回答
0
function fix(json){ 
  var updateUserToDate = function(object){ 
    if (!object['joined']){ object.joined = 0 }
  }
  json.myjsonobject.forEach(updateUserToDate);
  return json;
}

这是我的版本

如果您的数据仍然是字符串格式,您需要在将其发送到此函数之前对其调用 JSON.parse,正如 Ewald Stieger 指出的那样

于 2013-06-06T07:47:37.527 回答
0

我觉得有点混乱。

根据您提供的代码,我认为您正在使用这个 ChartJS: http ://chartjs.devexpress.com

:)

有了这个,我会尝试另一种方法来达到你的目标:明确指定你的论点类型:

argumentAxis: {
    grid: {
        visible: true
    },
    //add this line to specify
    argumentType: "datetime"
},

ChartJS 文档中的更多信息

于 2013-06-08T08:10:22.770 回答