You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Highchart Gantt数据填充问题:标记、名称及里程碑配置

Highcharts Gantt 图表数据填充问题解决方案

问题1:将details转换为里程碑(scatter系列)

先创建格式与标记样式的映射表,匹配details中不同format对应的符号、颜色,再遍历数据源生成scatter所需的数据结构:

修改后的document ready代码

$(document).ready(function () {
    var incomingdata = @Html.Raw(Newtonsoft.Json.JsonConvert.DeserializeObject(ViewData["dataView"].ToString()));
    var SeriesDataArray = [];
    var milestoneSeries = {
        type: 'scatter',
        name: 'Milestones',
        color: 'red',
        data: []
    };
    // 定义格式对应的标记样式映射
    var formatMarkerMap = {
        'Kickoff': { symbol: 'circle', fillColor: '#FF0000' },
        'Initial Out-brief': { symbol: 'triangle', fillColor: '#0000FF' },
        'Final Out-brief': { symbol: 'square', fillColor: '#00AA00' },
        'Milestone': { symbol: 'diamond', fillColor: '#FFA500' }
    };

    if (incomingdata != null && incomingdata.length > 0) {
        for (var i = 0; i < incomingdata.length; i++) {
            // 处理主任务数据
            let jsDate = new Date(incomingdata[i].start);
            var startUTC = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());
            
            jsDate = new Date(incomingdata[i].end);
            var endUTC = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());
            
            SeriesDataArray.push({
                name: incomingdata[i].name,
                start: startUTC,
                end: endUTC,
                y: incomingdata[i].y,
                id: incomingdata[i].id,
            });

            // 处理details生成里程碑数据
            var details = incomingdata[i].details;
            if (details && details.length > 0) {
                details.forEach(detail => {
                    let date = new Date(detail.x);
                    var xUTC = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate());
                    // 从映射表获取样式,默认用circle和灰色
                    var markerStyle = formatMarkerMap[detail.format] || { symbol: 'circle', fillColor: '#888888' };
                    milestoneSeries.data.push({
                        x: xUTC,
                        y: detail.y,
                        marker: {
                            symbol: markerStyle.symbol,
                            radius: 8,
                            fillColor: markerStyle.fillColor
                        },
                        dataLabels: {
                            enabled: true,
                            format: detail.format
                        }
                    });
                });
            }
        }

        BuildChart(SeriesDataArray, milestoneSeries);
    }
});

修改BuildChart函数

将主任务系列和里程碑scatter系列同时传入图表的series数组:

function BuildChart(SeriesDataArray, milestoneSeries) {
    Highcharts.ganttChart('container', 
    {
        title: {
            text: 'Gantt Chart with Multiple Symbols and Additional Text'
        },
        series: [
            {
                name: '任务',
                data: SeriesDataArray,
            },
            milestoneSeries // 添加里程碑系列
        ],       
    });
}

问题2:修复名称显示(tooltip里的[object Object]问题)

你之前的错误是把对象数组直接赋值给了series的name属性,series的name是整个系列的名称(字符串类型),单个任务的名称已经在SeriesDataArray的每个数据项name字段中。若要在y轴显示任务名称,需配置y轴的categories:

修正后的代码调整

  1. 在document ready中收集y轴分类:
// 新增变量存储y轴分类
var yAxisCategories = [];
// 在循环内添加:
yAxisCategories.push(incomingdata[i].id); // 可替换为incomingdata[i].name等你需要显示的名称
  1. 修改BuildChart函数,配置y轴和自定义tooltip:
function BuildChart(SeriesDataArray, milestoneSeries, yAxisCategories) {
    Highcharts.ganttChart('container', 
    {
        title: {
            text: 'Gantt Chart with Multiple Symbols and Additional Text'
        },
        yAxis: {
            categories: yAxisCategories, // 设置y轴分类名称
            title: {
                text: '任务'
            }
        },
        series: [
            {
                name: '任务',
                data: SeriesDataArray,
            },
            milestoneSeries
        ],
        tooltip: {
            // 自定义tooltip格式,确保显示正确内容
            formatter: function() {
                if (this.series.type === 'gantt') {
                    return `<b>${this.point.name}</b><br/>
                            开始: ${Highcharts.dateFormat('%Y-%m-%d', this.point.start)}<br/>
                            结束: ${Highcharts.dateFormat('%Y-%m-%d', this.point.end)}`;
                } else {
                    return `<b>${this.point.dataLabels.format}</b><br/>
                            日期: ${Highcharts.dateFormat('%Y-%m-%d', this.point.x)}`;
                }
            }
        }
    });
}
  1. 调用BuildChart时传入yAxisCategories:
BuildChart(SeriesDataArray, milestoneSeries, yAxisCategories);

修改后,tooltip会正确显示任务名称,y轴也会展示对应分类,不会再出现[object Object]的错误。


内容的提问来源于stack exchange,提问作者FlyFish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:14:51