Получение странного сообщения об ошибке от Highstock / Highcharts

#javascript #jquery #json #highcharts #highstock

#javascript #jquery #json #высокие диаграммы

Вопрос:

В настоящее время я работаю с Highstock / Highcharts и не хочу загружать данные через файл json, который у меня есть. Когда я пытаюсь получить данные, это выдает мне это сообщение об ошибке в консоли, которое я раньше не видел:

 highstock.js:456 Uncaught TypeError: f.data.slice is not a function
  

И я пытаюсь получить данные json с помощью этой функции. Я получаю это сообщение об ошибке только при вводе URL для моего data.json :

 $.each(names, function (i, name) {

        var dataUrl = 'http://local.priceservice.dev/js/data.json';

        $.getJSON(dataUrl,    function (data) {

            seriesOptions[i] = {
                name: name,
                data: data
            };

            // As we're loading the data asynchronously, we don't know what order it will arrive. So
            // we keep a counter and create the chart when all the data is loaded.
            seriesCounter  = 1;

            if (seriesCounter === names.length) {
                createChart();
            }
            console.log(data)
        });
    });
  

Я никогда раньше не видел этого сообщения, и я пытался искать, но я не могу найти кого-то, у кого была такая же проблема, как у меня.

Json:

 {
    "priceSeries": {
        "2016-10-19T12:51:51.000Z": [[1451606400000, 18.0], [1454284800000, 19.0], [1456790400000, 17.0], [1456790400000, 15.0], [1459468800000, 15.0], [1462060800000, 15.0], [1464739200000, 15.0], [1467331200000, 15.0], [1470009600000, 15.0], [1472688000000, 15.0], [1475280000000, 15.0], [1477958400000, 15.0], [1480550400000, 15.0], [1483228800000, 15.0], [1485907200000, 15.0], [1488326400000, 15.0]],
        "2016-11-19T12:51:51.000Z": [[1451606400000, 19.0], [1454284800000, 20.0], [1456790400000, 18.0], [1456790400000, 16.0], [1459468800000, 16.0], [1462060800000, 16.0], [1464739200000, 16.0], [1467331200000, 16.0], [1470009600000, 16.0], [1472688000000, 16.0], [1475280000000, 16.0], [1477958400000, 16.0], [1480550400000, 16.0], [1483228800000, 16.0], [1485907200000, 16.0], [1488326400000, 16.0]]
    }
}
  

Код Highstock / Highcharts:

 $(function () {
    var seriesOptions = [],
        seriesCounter = 0,
        names = ['MSFT', 'AAPL', 'GOOG'];
    /**
     * Create the chart when all data is loaded
     * @returns {undefined}
     */
    function createChart() {

        $('#container').highcharts('StockChart', {

            chart: {
                zoomType: 'x'
            },
            legend: {
                enabled: true
            },

            rangeSelector: {
                buttons: [{
                    type: 'hour',
                    count: 1,
                    text: '1h'
            }, {
                    type: 'day',
                    count: 1,
                    text: '1d'
            }, {
                    type: 'week',
                    count: 1,
                    text: '1w'
            }, {
                    type: 'month',
                    count: 1,
                    text: '1m'
            }, {
                    type: 'year',
                    count: 1,
                    text: '1y'
            }, {
                    type: 'all',
                    text: 'All'
            }],
                inputEnabled: false, // it supports only days
                selected: 4 // all
            },
            yAxis: {
                labels: {
                    formatter: function () {
                        return (this.value > 0 ? '   ' : '')   this.value   '%';
                    }
                },

                plotLines: [{
                    value: 0,
                    width: 2,
                    color: 'silver'
                }]
            },

            plotOptions: {
                series: {
                    compare: 'percent',
                    showInNavigator: true
                }
            },

            tooltip: {
                pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b> ({point.change}%)<br/>',
                valueDecimals: 2,
                split: true
            },

            series: seriesOptions
        });
    }

    $.each(names, function (i, name) {

        var dataUrl = 'http://local.priceservice.dev/js/data.json';

        $.getJSON(dataUrl,    function (data) {

            seriesOptions[i] = {
                name: name,
                data: data
            };

            // As we're loading the data asynchronously, we don't know what order it will arrive. So
            // we keep a counter and create the chart when all the data is loaded.
            seriesCounter  = 1;

            if (seriesCounter === names.length) {
                createChart();
            }
            console.log(data)
        });
    });
});
  

Заранее благодарю вас! 🙂

Ответ №1:

Данные последовательно должны быть массивом. Для серии требуется хотя бы один объект с данными в формате, подобном этому:

 series: [{
   data: [...] // <- has to be an array
}]
  

Ваша серия выглядит следующим образом:

 series: [{
   name: ...,
   data: { // <- you put an object instead of an array with points
      "priceSeries": ...
   }
}]
  

Приведенный выше код вызывает этот фрагмент для вызова объекта, например

 var someObj = {};
someObj.slice(); // Uncaught TypeError: someObj.slice is not a function(…)
  

Вы должны пойти этим путем:http://jsfiddle.net/r3xfxymm/1

Комментарии:

1. Спасибо за ответ, который помог!

2. Отлично! Сэкономил мои часы времени. Спасибо 🙂