selection.data返回不同类型的对象

时间:2017-12-06 01:15:06

标签: javascript d3.js web-inspector

每个循环,我对某些选择的对象执行一些更新(请参阅下面的代码段),首先使用exit()调用删除已删除的元素。我刚刚添加了一个滑块来修改其中一个对象中的参数,当滑块移动时,我调用相同的更新方法(再次使用下面的代码)。但是,当滑块触发更新时,选择会有所不同......特别是exit()方法失败--- TypeError: selection.exit is not a function(以及此问题的I think I'm avoiding the standard cause)。

var selection = svgSim.selectAll(".bh")
    .data(binary);

// Remove old
console.log("sel = ", selection);
var olds = selection.exit();
olds.remove();

当我将selection记录到控制台时,内容基本相同......但是对象类型似乎有些不同,或类似的东西。请参见下面的屏幕截图。 selection(" sel = [...]")的第一个打印输出是正常工作的时候。下次它引发错误,并且打印的格式不同 - 尽管它似乎包含相同的基本数据。

  • 为什么selection.data()在不同的上下文中调用时会返回不同类型的对象?

  • console.log输出有什么区别:什么是pt(在输出中)以及在此处打印的不同类型的对象。

注意:我理解这个非MWE是否不足以完全解决问题,这就是为什么我试图提出一些可能有助于我找到问题的具体(子)问题,没有-the-以下。

数据类似于

var phaseInit = Math.random();
var binary = [
    {name: "a", phase: phaseInit, mass: m1},
    {name: "b", phase: phaseInit + 0.5, mass: m2}
];

当滑块移动时,我修改数据如:

binary[0].mass = sliderScaleM1.invert(sval);

(对javascipt和d3来说很新)

enter image description here

1 个答案:

答案 0 :(得分:2)

由于我们无法访问MWE(see this comment),因此这是一个通用答案,试图根据提供的信息澄清问题。

在D3中,data()方法接受三件事:

  1. 数组;
  2. 一个功能;
  3. 没有
  4. 在第一种和第二种情况下,data() setter 。但是,在第三种情况下,data() getter

    我们可以在一个基本示例中看到这一点:

    var body = d3.select("body");
    var data = ["foo", "bar", "baz"];
    var sel = body.selectAll(null)
      .data(data);
    sel.enter()
      .append("p")
      .html(String)
    
    console.log(sel)
    <script src="https://d3js.org/d3.v4.min.js"></script>

    但是,如果我们使用data()作为吸气剂,我们就不再有选择了:

    var body = d3.select("body");
    var data = ["foo", "bar", "baz"];
    var sel = body.selectAll(null)
      .data(data);
    sel.enter()
      .append("p")
      .html(String)
    var sel2 = body.selectAll("p").data()
    
    console.log(sel2)
    <script src="https://d3js.org/d3.v4.min.js"></script>

    因此,你无法在该变量上调用exit():它不是D3选择,只是数据数组。

    查看您的控制台,我们可以看到,在19:57:07sel是常规的D3选择。但是,在19:57:12sel只是一个数组,更具体地说是数据数组。

    因此,总而言之,在您的代码中,您使用data()作为getter,而变量sel不再保留D3选择。