javascript - D3追加不同元素,保留共同索引

标签 javascript d3.js

我的应用程序应该根据数据类型将不同的元素附加到 SVG。我的代码或多或少看起来像这样:

 var elements = svg.selectAll(".elements")
    .data(someData)
    .enter().append("g");

var circles = elements.filter(function (d,i) {
    return d.type == "category1"
})
    .append("circle")


var rectangles = smallCircles.filter(function (d,i) {
            return d.type == "category2"
        })
            .append("rect")

因此,如果data.type =“catgory1”,程序应该附加一个圆形,如果等于“category2”,则应该附加一个矩形。我遇到的问题是我根据它们各自的索引(函数(d,i)中的“i”)设置它们在SVG上的位置。但是,为了做到这一点,我需要这两种元素类型之间的索引序列保持一致。有没有比只使用每次附加新元素时都会++ 的外部变量更好的方法?

最佳答案

有几种方法可以做到这一点。

首先,您可以使用 .each 并封装附加逻辑:

var elements = svg.selectAll(".elements")
  .data([
    {
      type: "category1"
    },{
      type: "category2"
    } 
  ])
  .enter().append("g");

elements.each(function(d,i){

  // i is index on everything

  var self = d3.select(this);
  switch(d.type) {
      case "category1":
          self.append("circle");
          break;
      case "category2":
          self.append("rect");
          break;
      default:
          break;
  }
});

或者,第二,更好的方法是让元素成为数据的一部分:

var data = [
    {
      type: "category1"
    },{
      type: "category2"
    } 
  ];

data.forEach(function(d){
  switch(d.type) {
      case "category1":
          d.elem = "circle"
          break;
      case "category2":
          d.elem = "rect"
          break;
      default:
          break;
  }
});

var svg = d3.select('body').append('svg');

var elements = svg.selectAll(".elements")
  .data(data)
  .enter().append("g");

elements.append(function(d){
  return document.createElement(d.elem);
});

关于javascript - D3追加不同元素,保留共同索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38438968/

相关文章:

javascript - d3 转换中圆的碰撞/重叠检测

javascript - 如何使用 d3.js 在折线图上的某个点显示图标

javascript - 鼠标悬停在 d3 上强制布局气泡不起作用

javascript - javascript D3.js中的透明颜色

javascript - 将 popupWindow = window.open 与 JavaScript 变量一起使用

javascript - 正则表达式 - 最小长度的字符串重复

javascript - 通过 AJAX 传递加密值返回不正确的值

javascript - Jquery Extend() 合并匿名对象,但不合并我的类的实例

Javascript:意外的 token 非法

javascript - D3 冰柱图中是否可以有多个父/根节点?