Перебираем массив объектов и складываем JS-панель диаграммы?

#javascript #chart.js

#javascript #chart.js

Вопрос:

Я получил следующий объект json из своего бэкэнда, который я хочу заполнить в многоуровневой диаграмме, используя Chart JS

 [
    {
        "user": {
            "username": "erik",
            "first_name": "erik",
            "email": "erik@admin.com"
        },
        "hours": {
            "day_1": 13.0,
            "day_2": 14.0,
            "day_3": 9.0,
            "day_4": 8.0,
            "day_5": 8.0,
            "day_6": 3.0,
            "day_7": null
        },
        "project": 21,
        "year": 2020,
        "week": 37
    },
    {
        "user": {
            "username": "mega",
            "first_name": "boy",
            "email": "mega@boy.com"
        },
        "hours": {
            "day_1": 5.0,
            "day_2": 10.0,
            "day_3": 8.0,
            "day_4": 8.0,
            "day_5": null,
            "day_6": null,
            "day_7": null
        },
        "project": 21,
        "year": 2020,
        "week": 37
    }
]
  

Мой ..data.labels JS в диаграмме добавляется вручную как ["Mon", "Tues", "Wed".... ,"Sun"] который соответствует каждому дню — теперь мне просто нужно правильно заполнить каждый day правильным значением

Есть какие-нибудь конкретные советы о том, как выполнить итерацию по этому набору данных и заполнить ....data.datasets[N].data часть диаграммы JS, как показано здесь:

             timesheetChartData: {
                type: 'bar',
                data: {
                    labels: ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'],
                    datasets: [ 
                        { 
                            label: 'Weekly Summary',
                            data: [], // array of what I assume will be stacked bars?
                            backgroundColor: "#2ecc71",
                            borderWidth: 1
                        },
                    ]
                },
                options: {
                    responsive: true,
                    lineTension: 1,
                    scales: {
                        yAxes: [{
                            ticks: {
                                beginAtZero: true,
                                padding: 25,
                            }
                        }],
                    }
                }
            },
  

Ответ №1:

Учитывая, что ваши внутренние данные присутствуют в массиве с именем baseData , вы могли бы использовать методы Array.map() и Object.values() для генерации datasets следующим образом:

 const colors = ['green', 'red'];
const datasets = baseData.map((o, i) => ({
  label: o.user.username,
  data: Object.values(o.hours),
  backgroundColor: colors[i]
}));
  

Пожалуйста, взгляните на ваш исправленный код ниже:

 const baseData = [{
    "user": {
      "username": "erik",
      "first_name": "erik",
      "email": "erik@admin.com"
    },
    "hours": {
      "day_1": 13.0,
      "day_2": 14.0,
      "day_3": 9.0,
      "day_4": 8.0,
      "day_5": 8.0,
      "day_6": 3.0,
      "day_7": null
    },
    "project": 21,
    "year": 2020,
    "week": 37
  },
  {
    "user": {
      "username": "mega",
      "first_name": "boy",
      "email": "mega@boy.com"
    },
    "hours": {
      "day_1": 5.0,
      "day_2": 10.0,
      "day_3": 8.0,
      "day_4": 8.0,
      "day_5": null,
      "day_6": null,
      "day_7": null
    },
    "project": 21,
    "year": 2020,
    "week": 37
  }
];

const colors = ['green', 'red'];
const datasets = baseData.map((o, i) => ({
  label: o.user.username,
  data: Object.values(o.hours),
  backgroundColor: colors[i]
}));

new Chart('canvas', {
  type: 'bar',
  data: {
    labels: ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'],
    datasets: datasets
  },
  options: {
    responsive: true,
    title: {
      display: true,
      text: 'Weekly Summary'
    },
    scales: {
      yAxes: [{
        stacked: true,
        ticks: {
          beginAtZero: true
        }
      }],
      xAxes: [{
        stacked: true
      }]
    }
  }
});  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="canvas"></canvas>