【问题标题】:D3.js - Uncaught TypeError: .enter(...).append(...).merge is not a functionD3.js - 未捕获的类型错误:.enter(...).append(...).merge 不是函数
【发布时间】:2020-12-16 19:29:43
【问题描述】:

我正在尝试使用 d3.js 构建一个包含多个嵌套下拉列表的表格。当我使用较新版本的 d3 时,我的代码工作得很好,但是由于各种原因,我需要使用 d3.js v3,当我用旧版本替换较新版本时,我得到以下信息:

Uncaught TypeError: options4.enter(...).append(...).merge is not a function

我假设旧版本的 d3 没有 merge() 函数,但是我不知道用什么代替它。

这是我的代码:

<script src="https://d3js.org/d3.v3.min.js"></script>

var colorScheme = d3.scale.ordinal()
                .domain(["USA", "PRI", "CAN"])
                .range(["#d52922", "#d69105", "#4b7ba1"]);

var jobsCsvData = null;

d3.csv("master_info_final_v12_conversion.csv", function(data) {

data.forEach(function(d) {
    d["index"] = d["index"];
    d["name"] = d["name"];
    d["city"] = d["city"];
    d["state"] = d["state"];
    d["country"] = d["country"];
});

JobsCsvData = data;

var nestedTwo = d3.nest()
 .key(function(d) {
  return d.country;
 })
 .key(function(d) {
  return d.state;
})
.key(function(d) {
  return d.city;
})
.entries(data);

function updateLocationValues(g) {
  var filtered = filtered2[0].values.filter(function(d) {
    return d.key == g;
  });

  var options5 = d3.select("#select5")
    .selectAll("option")
    .data(filtered[0].values.map(function(d) {
    //.data(filtered3[0].values.map(function(d) {
      return d.key;
    }));

  options5.exit().remove();

这是给我带来问题的 merge() 函数。

  options5.enter()
    .append("option")
    .merge(options5)
    .text(function(d) {
      return d;
    });
    tabulate(data);
  }

 var options5 = d3.select("#select5")
   .selectAll("option")
   .data(filtered3[0].values.map(function(d) {
  return d.key;
  }.)).enter()
  .append("option")
  .text(function(d) {
  return d;
 });

.... {more code}

}

如果这还不够,我可以包含更多代码。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript html d3.js html-table data-visualization


    【解决方案1】:

    D3v3 神奇地将输入选择包含在更新选择中,在幕后为您完成合并。从 d3v4 开始,您需要显式合并输入和更新。

    要编码合并更新并进入d3v3,您基本上只需删除合并语句并在输入所有内容后使用更新选择。而不是:

    var update = d3.selectAll("...").data(...);
    
    enter = update.enter().append()....
    
    update.merge(enter).attr(....
    

    你可以简单地使用:

    var update = d3.selectAll("...").data(...)
    
    update.enter().append()....
    
    update.attr(... // includes both enter and update.
    

    本质上,d3v4 中的变化是选择是不可变的,输入选择不再神奇地添加到您执行输入后的幕后更新选择中。但是,为了让输入和更新选择结合起来,d3 引入了selection.merge() 方法,该方法通过结合两个返回一个新的选择。

    这里有几个 sn-ps,显示了 d3v3(第一)与 d3v4+(第二)在每个步骤的每个选择中的内容:

    var original = d3.selectAll("p")
      .data([1,2,3])
      .enter()
      .append("p")
      
    original.append("span").text(d=>d);
      
    // update selection pre enter.
    var update = d3.selectAll("p")
      .data([1,2,3,4,5]) // two new elements.
      
      update.append("span")
        .text("  in update selection pre enter");
        
    // enter selection.
    var enter = update.enter()
      .append("p")
      
      enter.append("span").text(d=>d + " in enter selection");
      
    // update post-enter.
    update.append("span").text(" | in update selection after enter");
    p {
      border: 1px dotted black;
      padding: 4px;
    }
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"&gt;&lt;/script&gt;

    对比

    var original = d3.selectAll("p")
      .data([1,2,3])
      .enter()
      .append("p")
      
    original.append("span").text(d=>d);
      
    // update selection pre enter.
    var update = d3.selectAll("p")
      .data([1,2,3,4,5]) // two new elements.
      
      update.append("span")
        .text("  in update selection pre enter");
        
    // enter selection.
    var enter = update.enter()
      .append("p")
      
      enter.append("span").text(d=>d + " in enter selection");
      
    // update post-enter.
    update.append("span").text(" | in update selection after enter");
    
    // merge:
    update.merge(enter).append("span").text(" | in merged selection ");
    p {
      border: 1px dotted black;
      padding: 4px;
    }
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"&gt;&lt;/script&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 2018-01-16
      • 1970-01-01
      • 2016-05-12
      • 2019-02-10
      • 2018-01-29
      • 2015-07-20
      相关资源
      最近更新 更多