第 2 部分 - 如何对重复的标签进行分组,以便在 chart.js 中创建没有重复的标签

part 2 - how to group duplicate labels in order to create a label without duplicates in chart.js

这是这个问题的延续 但是问题来自于数据的变化,当然我已经尝试过修改格式json但是因为我使用pandas来获得这种格式json它不会很pythonic修改dataframe格式

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
<div class="trendmensuel">
    <canvas id="trendmensuel"></canvas>
</div>

<script>
       var trendMensuel = [ 
  { produit: "HOME40Z", mois: "Janvier", effectif: 6, bgColor: "red" },
  { produit: "HOME60", mois: "Janvier", effectif: 7, bgColor: "green" },

  { produit: "HOME40Z", mois: "Février", effectif: 6, bgColor: "red" },
  { produit: "PRO", mois: "Fevrier", effectif: 9, bgColor: "blue" },

  { produit: "HOME60", mois: "Mars", effectif: 3, bgColor: "green" },
];


   var label_trendMensuel = trendMensuel.map(function(e){
    return e.mois;
   });

   var produit_trendMensuel = trendMensuel.map(function(e){
    return e.produit;
   });

   var effectif_trendMensuel = trendMensuel.map(function(e){
    return e.effectif;
   });;

var ctx = document.getElementById("trendmensuel");
var chart = new Chart(ctx, {
   type :"bar",
   data : {
     labels : label_trendMensuel, // ito efa mety
     datasets:[
     {
        type: "bar",
        backgroundColor: "rgba(54, 162, 235, 0.2)",
        borderColor: "rgba(54, 162, 235, 1)",
        borderWidth: 1,
        label: produit_trendMensuel,
        data: effectif_trendMensuel,
     },],
   },

   });

</script>

您可以得到一个月份数组,并根据月份数组中的索引追加数据集数据。

示例如下

var trendMensuel = [
  { produit: "HOME40Z", mois: "Janvier", effectif: 1, bgColor: "red" },
  { produit: "HOME60", mois: "Janvier", effectif: 2, bgColor: "green" },

  { produit: "HOME40Z", mois: "Février", effectif: 3, bgColor: "red" },
  { produit: "PRO", mois: "Février", effectif: 4, bgColor: "blue" },

  { produit: "HOME60", mois: "Mars", effectif: 5, bgColor: "green" },
];

const months = trendMensuel.reduce((a, b) => {
  const i = a.findIndex(x => x === b.mois);
  if (i === -1) {
    a.push(b.mois);
  }
  return a;
}, []);

const lenOfMonth = months.length;

const products = trendMensuel.reduce((a, b) => {
  const i = months.findIndex(y => y === b.mois);
  const j = a.findIndex(y => y.label === b.produit);

  if (j === -1) {
    const obj = {
      type: "bar",
      backgroundColor: b.bgColor,
      borderColor: "rgba(54, 162, 235, 1)",
      borderWidth: 1,
      label: b.produit,
      data: new Array(lenOfMonth).fill(0),
    };
    obj.data[i] = b.effectif;
    a.push(obj);
  } else {
    a[j].data[i] = b.effectif;
  }

  return a;
}, []);

var ctx = document.getElementById("trendmensuel").getContext("2d");
var chart = new Chart(ctx, {
  type: "bar",
  data: {
    labels: months, // ito efa mety
    datasets: products,
  },
});
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.4.1/dist/chart.min.js"></script>
<canvas id="trendmensuel" width="400" height="400"></canvas>