Search code examples
javascriptarraysamcharts

How to Iterate through a nested JSON array in amcharts tooltip HTML


I have a data variable with following JSON

var data = [

        {
            "district": "Karachi West",
            "visits": 13223,
            "distSubParts": [
           {
                "name": "ABC",
                "svisits": 212
            },
            {
                "name": "ZXA",
                "svisits": 1323
            }
            ]


        },
{
            "district": "Quetta South",
            "visits": 234232,
            "distSubParts": [
           {
                "name": "GGG",
                "svisits": 234
            },
            {
                "name": "RRR",
                "svisits": 234432
            }
            ]


        },



    ];

and AMCharts Series HTML as

series.tooltipHTML = `<center><strong> {district}</strong></center>
                            <hr />
                            <table>
                            <tr>
                              <th align="left">Name</th>
                              <td>{distSubParts.name}</td>
                            </tr>
                            <tr>
                              <th align="left">Visits</th>
                              <td>{distSubParts.svisits}</td>
                            </tr>
                            </table>
                           `;

Now when I see tooltip it is like the image below showing nothing of distSubParts nested array

https://i.sstatic.net/kxLTc.jpg

How Could I iterate through the distSubParts nested array and show it in AMCharts tooltip?

I have read AMCharts Docs AMCharts Tooltip but could not find a way to iterate through nested array


Solution

  • amCharts doesn't format nested data arrays. The guide on data arrays, the guide on using string formatting & data placeholders, and all the demos use flat arrays.

    To go beyond what's built-in, use an adapter for the tooltipHTML property and manually iterate over the nested array there. Keep the first part of the string that's already supported, this will allow the tooltip to trigger and the adapter for the property with it as well. Since you're using series.tooltipHTML I presume you have the chart cursor enabled. In this case the target argument for the adapter will always return the series, it may not be clear how to acquire the currently-hovered column's data at this point. To do so just refer to the series' tooltipDataItem property. The data, if any, will be within its dataContext property. So your code could look something like this:

    // Set a tooltipHTML so the adapter can trigger
    series.tooltipHTML = `<center><strong> {district}</strong></center>
    <hr />`;
    
    // Use an adapter to iterate through the nested array and provide formatted HTML
    series.adapter.add("tooltipHTML", function(html, target) {
      if (
        target.tooltipDataItem.dataContext &&
        target.tooltipDataItem.dataContext.distSubParts &&
        target.tooltipDataItem.dataContext.distSubParts.length
      ) {
        var nameCells, svisitsCells;
        nameCells = "";
        svisitsCells = "";
        target.tooltipDataItem.dataContext.distSubParts.forEach(part => {
          nameCells += `<td>${part.name}</td>`;
          svisitsCells += `<td>${part.svisits}</td>`;
        });
        html += `<table>
        <tr>
          <th align="left">Name</th>
          ${nameCells}
        </tr>
        <tr>
          <th align="left">Visits</th>
          ${svisitsCells}
        </tr>
        </table>`;
      }
      return html;
    });
    

    Here's the above in a demo:

    https://codepen.io/team/amcharts/pen/9acac2b5b0fcb105c8bf4ed29767430d