Chart.js параметры sciptable: доступ к значениям объекта данных?

#javascript #chart.js #chart.js3

Вопрос:

Я собираю данные с помощью API.

Поставляется в формате JSON:

[{'time':'08h00','magnitude':25, 'temper':12.6},{'time':'09h00','magnitude':39, 'temper': 5.3}]

Составляю свою карту:

 const ctx = document.getElementById('chart').getContext('2d');
    const chart = new Chart(ctx, {
        type: 'line',
        data: {
            datasets: [{
                label: "Line Graph",
                data: [],
                parsing: {
                    xAxisKey: 'time',
                    yAxisKey: 'temper'
                },
                borderColor: function(context) {
                    var index = context.dataIndex;
                    var value = context.dataset.data[index];
                    console.log(value);
                    return value > 10 ? 'red' : 'green';
                },
                
            }]
        },
        options: {
            scales: {
                x: {
                    type: 'time',
                    time: {
                        unit: 'day',
                    },
                },
            },
            responsive: 'true',
        }
    });
 

Затем я заполняю его:

 function addData(chart, data) {
    for (x in data) {
        chart.data.datasets[0].data.push(data[x]);
    }
    chart.update();
}

$.getJSON("https://8.0.0.85/last_48_hours", function (data) {
        addData(chart, data)
    });
 

Моя проблема связана с этим, что вытекает прямо из документов:

  borderColor: function(context) {
                    var index = context.dataIndex;
                    var value = context.dataset.data[index];
                    console.log(value);
                    return value > 10 ? 'red' : 'green';
                },
 

потому value что это целое Object {'time':'08h00','magnitude':25, 'temper':12.6}

var value = context.dataset.data[index].temper; и var value = context.dataset.data[index]['temper'];

и всякое такое не работает. Как я могу ссылаться value['temper'] ?

Ответ №1:

Я не могу сказать вам, почему это не работает, но вы можете изменить следующую строку внутри скриптовой функции.

От:

 var value = context.dataset.data[index].temper; 
 

Для:

 var value = context.dataset.data[index]?.temper;
 

Проблема в том, что context.dataset.data[index] иногда это приводит к undefined .

Пожалуйста, ознакомьтесь с вашим измененным кодом ниже:

 new Chart('myChart', {
  type: 'line',
  data: {
    datasets: [{
      label: "Line Graph",
      data: [{
        'time': '08h00',
        'magnitude': 25,
        'temper': 12.6
      }, {
        'time': '09h00',
        'magnitude': 39,
        'temper': 5.3
      }],
      parsing: {
        xAxisKey: 'time',
        yAxisKey: 'temper'
      },
      borderColor: function(context) {
        var index = context.dataIndex;
        var value = context.dataset.data[index]?.temper;
        return value > 10 ? 'red' : 'green';
      }
    }]
  },
  options: {
    scales: {
      x: {
        type: 'time',
        time: {
          parser: 'HHhmm',
          unit: 'day',
        },
      },
    },
    responsive: 'true'
  }
}); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.27.0"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment@0.1.1"></script>
<canvas id="myChart"></canvas> 

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

1. Точно справа. В конце концов я разобрался в этом сам, и все свелось к порядку операций. Я пошел по другому пути к тому же эффекту, просто добавив туда оператор if.