javascript - 如何循环遍历 d3 中的内部值数组并添加相应的子元素?

标签 javascript arrays d3.js svg

我的 JSON 数据如下所示。

var data = [ 
 { animal: 'dog', names: [ 'mark', 'cooper', 'pooch' ] },
 { animal: 'cat', names: [ 'mary', 'kitty' ]
];

根据这些数据,我需要按以下方式使用 d3 生成 SVG 元素。

<svg id="mysvg" width="500" height="500">
 <g data-animal="dog" transform="translate(0,0)">
  <text x="10" y="10" fill="black">dog</text>
  <text x="10" y="25" fill="black">mark</text>
  <text x="10" y="40" fill="black">cooper</text>
  <text x="10" y="55" fill="black">pooch</text>
 </g>
 <g data-animal="cat" transform="translate(0, 100)">
  <text x="10" y="10" fill="black">cat</text>
  <text x="10" y="25" fill="black">mary</text>
  <text x="10" y="40" fill="black">kitty</text>
 </g>
</svg>

要创建 g 元素,我执行如下操作。我保留 g 变量以附加更多元素。

var g = d3.select('#mysvg')
 .selectAll('g')
 .data(data)
 .enter().append('g')
 .attr({ 
  'data-animal': function(d) { return d.animal; }, 
  transform: function(d) { return 'translate(' + ... + ')'; } 
 });

现在我可以附加第一个 text 元素,如下所示。

g.append('text')
 .attr({ x: '10', y: '10', fill: 'black' })
 .text(function(d) { return d.animal; });

如何通过迭代每个 data[i].names 数组来向每个 g 附加更多元素?

最佳答案

一种方法是使用 .each函数对每个数据点进行操作。请注意,我们使用 d3.select(this) 来获取当前的 g。

 g.each(function(d) {
    for(var i = 0; i < d.names.length; i++) {
     d3.select(this).append('text')
       .attr({ x: '10', y: '10', fill: 'black' })
       .text(function(d) { return d.names[i]; });
  }
 });

关于javascript - 如何循环遍历 d3 中的内部值数组并添加相应的子元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36755257/

相关文章:

javascript - 在 jquery 智能向导控件上启用/禁用按钮单击事件

java - 二元运算符的操作数类型错误 "*"

c# - 如何在 C# 中使用 3 个数组分配变量

php - 在PHP中获取嵌套数组的算法

javascript - d3轨道使用变换旋转

javascript - 为什么D3的刷开始事件会干扰后面的刷事件?

php - F5后如何保存页面状态

php - 如何使用 Joomla 作为服务器配置跨源资源共享 (CORS)?

javascript - Ajax:提交带有表单名称的表单

javascript - 使用d3.js实现元素的过渡效果