如何对重复的标签进行分组,以便在 chart.js 中创建没有重复的标签
how to group duplicate labels in order to create a label without duplicates in chart.js
我似乎无法解决这个问题:
我的标签给我发回列表,
在我的例子中,我希望只有 HOME40、HOME60 和 PRO 作为标签,但不幸的是它 returns 它们的串联,
我也想换颜色,如果产品是HOME40那么颜色必须是绿色,如果是PRO那么颜色就是红色。
有人有什么建议吗?
<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: 6, bgColor: "red" },
{ produit: "HOME60", mois: "Janvier", effectif: 7, bgColor: "green" },
{ produit: "PRO", mois: "Janvier", effectif: 9, bgColor: "blue" },
{ produit: "HOME40Z", mois: "Février", effectif: 3, bgColor: "red" },
{ produit: "HOME60", mois: "Février", effectif: 4, bgColor: "green" },
{ produit: "PRO", mois: "Février", effectif: 1, bgColor: "blue" },
];
const data = trendMensuel.reduce(
(a, b) => {
const i = a.months.findIndex(x => x === b.mois);
const j = a.products.findIndex(y => y.label === b.produit);
if (i === -1) {
a.months.push(b.mois);
}
if (j === -1) {
a.products.push({
type: "bar",
backgroundColor: b.bgColor,
borderColor: "rgba(54, 162, 235, 1)",
borderWidth: 1,
label: b.produit,
data: [b.effectif],
});
} else {
a.products[j].data.push(b.effectif);
}
return a;
},
{ months: [], products: [] }
);
var ctx = document.getElementById("trendmensuel").getContext("2d");
var chart = new Chart(ctx, {
type: "bar",
data: {
labels: data.months, // ito efa mety
datasets: data.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>
我似乎无法解决这个问题: 我的标签给我发回列表, 在我的例子中,我希望只有 HOME40、HOME60 和 PRO 作为标签,但不幸的是它 returns 它们的串联, 我也想换颜色,如果产品是HOME40那么颜色必须是绿色,如果是PRO那么颜色就是红色。 有人有什么建议吗?
<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: 6, bgColor: "red" },
{ produit: "HOME60", mois: "Janvier", effectif: 7, bgColor: "green" },
{ produit: "PRO", mois: "Janvier", effectif: 9, bgColor: "blue" },
{ produit: "HOME40Z", mois: "Février", effectif: 3, bgColor: "red" },
{ produit: "HOME60", mois: "Février", effectif: 4, bgColor: "green" },
{ produit: "PRO", mois: "Février", effectif: 1, bgColor: "blue" },
];
const data = trendMensuel.reduce(
(a, b) => {
const i = a.months.findIndex(x => x === b.mois);
const j = a.products.findIndex(y => y.label === b.produit);
if (i === -1) {
a.months.push(b.mois);
}
if (j === -1) {
a.products.push({
type: "bar",
backgroundColor: b.bgColor,
borderColor: "rgba(54, 162, 235, 1)",
borderWidth: 1,
label: b.produit,
data: [b.effectif],
});
} else {
a.products[j].data.push(b.effectif);
}
return a;
},
{ months: [], products: [] }
);
var ctx = document.getElementById("trendmensuel").getContext("2d");
var chart = new Chart(ctx, {
type: "bar",
data: {
labels: data.months, // ito efa mety
datasets: data.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>