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

D3.js力导向图点击父节点隐藏关联子节点时map报错如何解决

D3.js力导向图点击父节点隐藏子节点实现方案

报错原因

你代码中调用filter的link变量是D3的DOM选择集对象,不是原生JavaScript数组,调用filter方法后返回的仍然是D3选择集实例,没有数组原生的map方法,因此触发newLinks.map is not a function报错。

修复&功能实现

直接从原始的data.links数据数组中过滤关联连线,再匹配对应子节点,同时支持点击切换显隐状态,修改后的onClick函数如下:

function onClick(event, d) {
  // 仅父节点点击触发逻辑,过滤子节点点击事件
  if (d.type !== 'parent') return

  // 从原始数据中过滤所有目标为当前点击父节点的连线
  const relatedLinks = data.links.filter(link => {
    const targetId = typeof link.target === 'string' ? link.target : link.target.id
    return targetId === d.id
  })
  // 提取关联子节点的ID
  const childNodeIds = relatedLinks.map(link => {
    return typeof link.source === 'string' ? link.source : link.source.id
  })

  // 切换关联子节点显隐状态
  node.filter(n => childNodeIds.includes(n.id))
    .style('display', item => item.hidden ? 'block' : 'none')
    .each(item => item.hidden = !item.hidden)

  // 切换对应关联连线的显隐状态
  link.filter(l => {
    const sourceId = typeof l.source === 'string' ? l.source : l.source.id
    const targetId = typeof l.target === 'string' ? l.target : l.target.id
    return childNodeIds.includes(sourceId) && targetId === d.id
  })
    .style('display', item => item.hidden ? 'block' : 'none')
    .each(item => item.hidden = !item.hidden)
}

可选优化

如果需要隐藏节点后力导向图重新计算布局、消除隐藏节点占位,可以在每次显隐切换后,过滤掉隐藏的节点和连线,重新更新力模拟数据并重启:

// 在onClick函数末尾添加以下代码
const visibleNodes = data.nodes.filter(n => !n.hidden)
const visibleLinks = data.links.filter(l => !l.hidden)
force.nodes(visibleNodes)
  .force("link").links(visibleLinks)
force.alpha(0.3).restart()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:45:00