这个问题与CanvasJS有关,但是纯JavaScript的任何专家都可以提供帮助。

我需要一个按钮来隐藏/取消隐藏canvasjs图形中的所有元素。
有一个工作代码可以使用数组索引隐藏元素:

chart.options.data[0].visible = !chart.options.data[0].visible;


我正在尝试遍历数组,但是它不起作用,显然我的代码是错误的:

chart.options.data.forEach(visible = !visible);


我该如何解决?

完整的代码段为:


 var chart = new CanvasJS.Chart("chartContainer",
    {
      title:{
      text: "Test Button to Hide All Series"
      },

      legend: {
            cursor: "pointer",
            itemclick: function (e) {
                //console.log("legend click: " + e.dataPointIndex);
                //console.log(e);
                if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
                    e.dataSeries.visible = false;
                } else {
                    e.dataSeries.visible = true;
                }

                e.chart.render();
            }
        },

      data: [
      {
        showInLegend: true,
        type: "line",
        dataPoints: [
        { x: 10, y: 5 },
        { x: 20, y: 9},
        { x: 30, y: 17 },
        { x: 40, y: 32 },
        { x: 50, y: 22 },
        { x: 60, y: 14 },
        { x: 70, y: 25 },
        { x: 80, y: 18 },
        { x: 90, y: 20}

        ]
      },
        {
        showInLegend: true,
        type: "line",
        dataPoints: [
        { x: 10, y: 31 },
        { x: 20, y: 35},
        { x: 30, y: 30 },
        { x: 40, y: 35 },
        { x: 50, y: 35 },
        { x: 60, y: 38 },
        { x: 70, y: 38 },
        { x: 80, y: 34 },
        { x: 90, y: 44}

        ]
      },
        {
        showInLegend: true,
        type: "line",
        dataPoints: [
        { x: 10, y: 25 },
        { x: 20, y: 30},
        { x: 30, y: 20 },
        { x: 40, y: 45 },
        { x: 50, y: 30 },
        { x: 60, y: 10 },
        { x: 70, y: 15 },
        { x: 80, y: 18 },
        { x: 90, y: 20}

        ]
      }
      ]
    });

    chart.render();

 document.getElementById("showAllSeries").onclick =  function(){
   //Works for a single element using index:
   chart.options.data[0].visible = !chart.options.data[0].visible;
   //Doesn't work, need to modify
   //chart.options.data.forEach(visible = !visible);
   chart.render();
 };

<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
<br/>
<div id="chartContainer" style="height: 300px; width: 100%;"></div>
<center><button id= "showAllSeries" style= "margin: 10px;">Show/Hide All series</button></center>





上:
找到带有for循环的解决方案:

   for (var i = 0; i < chart.options.data.length; i++) {
   chart.options.data[i].visible = !chart.options.data[i].visible;
   }


但是仍然很有趣,它应该如何与foreach一起使用

最佳答案

forEach是一个Array方法,可用于在数组中的每个元素上执行函数。另一方面,是一个更灵活的循环。

在您的情况下,可以使用for或forEach隐藏按钮上的所有dataSeries onclick。检查以下代码:



var chart = new CanvasJS.Chart("chartContainer", {
	title:{
		text: "Test Button to Hide All Series"
	},

	legend: {
		cursor: "pointer",
		itemclick: function (e) {
			if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
				e.dataSeries.visible = false;
			} else {
				e.dataSeries.visible = true;
			}
			e.chart.render();
		}
	},

	data: [
		{
		showInLegend: true,
		type: "line",
		dataPoints: [
			{ x: 10, y: 5 },
			{ x: 20, y: 9 },
			{ x: 30, y: 17 },
			{ x: 40, y: 32 },
			{ x: 50, y: 22 },
			{ x: 60, y: 14 },
			{ x: 70, y: 25 },
			{ x: 80, y: 18 },
			{ x: 90, y: 20 }
		]
		},
		{
		showInLegend: true,
		type: "line",
		dataPoints: [
			{ x: 10, y: 31 },
			{ x: 20, y: 35 },
			{ x: 30, y: 30 },
			{ x: 40, y: 35 },
			{ x: 50, y: 35 },
			{ x: 60, y: 38 },
			{ x: 70, y: 38 },
			{ x: 80, y: 34 },
			{ x: 90, y: 44 }
		]
		},
		{
		showInLegend: true,
		type: "line",
		dataPoints: [
			{ x: 10, y: 25 },
			{ x: 20, y: 30 },
			{ x: 30, y: 20 },
			{ x: 40, y: 45 },
			{ x: 50, y: 30 },
			{ x: 60, y: 10 },
			{ x: 70, y: 15 },
			{ x: 80, y: 18 },
			{ x: 90, y: 20 }
		]
		}
	]
});

chart.render();

document.getElementById("showAllSeries").onclick =  function(){
	chart.options.data.forEach(function(dataSeries) {
  	if (typeof (dataSeries.visible) === "undefined" || dataSeries.visible) {
			dataSeries.visible = false;
		} else {
			dataSeries.visible = true;
		}
	});
	/*var dataSeries;
  	for(var i = 0; i < chart.data.length; i++){
  	dataSeries = chart.options.data[i];
		if (typeof (dataSeries.visible) === "undefined" || dataSeries.visible) {
			dataSeries.visible = false;
		} else {
			dataSeries.visible = true;
		}
	}*/
	chart.render();
};

<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
<div id="chartContainer" style="height: 260px; width: 100%;"></div>
<center><button id= "showAllSeries" style= "margin: 10px;">Show/Hide All series</button></center>

09-11 08:12