2013-06-06 3 views
1

Я нахожусь на своей новичке, изучая javascript. Я сделал API, который получает число пользователей, зарегистрированных в определенную дату, и возвращает эти данные как объект JSON. Ниже приведен пример этих данныхФункция Javascript для проверки отсутствующих дат на объекте 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"}]} 

я тогда анализировать данные и график на ChartJS рёберном графе, используя функцию яваскрипта ниже

$(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 пользователей, где отсутствует дата. Таким образом, график будет отображать нуль, где не была возвращена дата. Он должен проверить это на самую раннюю дату. Какие-нибудь идеи?

Благодаря

+0

так что вы хотите, чтобы это вернуть ложный { "myjsonobject": [{ "пользователи": 3]}, но п от этого {"myjsonobject": [{"users": 3, "join": "2013-05-25"}, {"users": 3}]}? –

+0

Почему бы не сделать json на стороне сервера только с отсутствующей логикой даты и предоставить его API диаграмм. Зачем делать дополнительную работу на стороне клиента? – amrinder007

+0

Нет. Я хотел бы, чтобы объект JSON оставался как есть, но в случае отсутствия даты он должен добавить 0. Например {«myjsonobject»: [{«users»: 3, «join»: «2013 -05-25 "}, {" users ": 0," join ":" 2013-05-26 "}, {" users ": 2," join ":" 2013-05-27 "}]} – Magondu

ответ

2

Как заполнить missin g в массиве, описывающем диапазон

Предполагая, что начальный массив уже отсортирован, вы можете скопировать первый элемент в исходном массиве в новый, а затем итеративно нажать «объекты по умолчанию» в целевой массив или скопировать из исходного массива, когда имеется соответствующий объект. Повторяйте, пока не достигнете конца вашего диапазона.

Чтобы проверить, есть ли подходящий объект, вы можете сначала проиндексировать исходный массив любым параметром, который вы хотите перебрать (в вашем случае: поле «join»). Это означает, что этот параметр должен быть уникальным.

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

Это создает хэш-массив вашего массива. Поиск элемента по его ключевому (в вашем случае «присоединился к» поле) очень просто:

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/

+0

Спасибо, Роман. Это было именно то, что мне нужно – Magondu

+0

Я знаю, что это старая тема .... но этот код не включает последнюю дату в выходе. '{" users ": 1," join ":" 2013-05-31 "}' является частью json, но последняя дата выдана 05-30. Если я добавлю больше дат, последний не будет включен в вывод. – harryBundles

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; 
} 
+0

Позвольте мне попробовать его – Magondu

0
function fix(json){ 
    var updateUserToDate = function(object){ 
    if (!object['joined']){ object.joined = 0 } 
    } 
    json.myjsonobject.forEach(updateUserToDate); 
    return json; 
} 

это моя версия этого

если данные по-прежнему в формате строки вам нужно будет позвонить JSON.parse на него прежде чем отправить его на эту функцию, как указывает Эвальд Стигер

0

Я чувствую, что есть немного путаницы.

на основе кода вы предоставили, я думаю, что вы используете этот ChartJS: http://chartjs.devexpress.com

:)

с этим, я хотел бы попробовать еще один способ достичь своей цели: указать явно тип ваших аргументов :

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

Подробнее in ChartJS documentation

+1

Привет, Андрей, Да, я использую Chartjs. Уже есть функция синтаксического анализа в файлах javascript ChartJS, которые поставляются вместе с ним. Следуя методологии, предложенной Романом, мой код работал так, как я ожидал. Не уверен, что я буду пытаться достичь, добавив эту строку. Пожалуйста, совет – Magondu

+1

В Интернете есть два продукта с названием «ChartJS». Один из них управляется независимым разработчиком, а другой управляется DevExpress. Вы определенно используете второй, но ссылка, которую вы использовали, указывала на сайт первого продукта. Я предполагал, что вы все еще предоставляете даты в виде строк, без использования синтаксического анализа даты. Код, который я предоставил, позволит автоматически анализировать внутри самого dxChart, без необходимости писать собственный код. Это единственная разница. –

Смежные вопросы