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

无法将JSON文件导入d3.js,遇TypeError等问题求助

解决D3.js导入JSON时的map函数错误问题

问题根源

你遇到的TypeError: myWords.map is not a function,本质是解析后的JSON数据不是数组类型,map方法仅能在数组上调用。而输出object Object也说明你上传的JSON结构可能是对象(比如{ "words": ["词1", "词2"] }),而非直接的字符串数组。

解决方案

1. 确认JSON文件结构

你的JSON文件需要是纯字符串数组,格式如下:

["JavaScript", "D3.js", "数据可视化", "前端开发"]

如果你的JSON是对象嵌套数组(比如后端返回的格式),比如:

{
  "content": ["JavaScript", "D3.js", "数据可视化", "前端开发"]
}

则需要提取对应的数组字段。

2. 修改代码适配数据结构

修正后的完整代码

<!DOCTYPE html>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.js"></script>
<script src="https://cdn.jsdelivr.net/gh/holtzy/D3-graph-gallery@master/LIB/d3.layout.cloud.js"></script>
<div id="my_dataviz"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>

var uploadButton = $('<input type="file">');
uploadButton.change(function() {
  var reader = new FileReader();
  reader.onload = function (e) {
    try {
      var data = JSON.parse(e.target.result);
      console.log("解析后的数据:", data);

      // 核心:确保myWords是数组
      let myWords = [];
      // 情况1:如果JSON本身是数组
      if (Array.isArray(data)) {
        myWords = data;
      } 
      // 情况2:如果JSON是对象,且有指定的数组字段(比如content)
      else if (data.content && Array.isArray(data.content)) {
        myWords = data.content;
      }
      // 其他情况抛出错误提示
      else {
        throw new Error("JSON结构不符合要求,需要是数组或包含数组字段的对象");
      }

      var margin = {top: 10, right: 10, bottom: 10, left: 10},
          width = 1024 - margin.left - margin.right,
          height = 1024 - margin.top - margin.bottom;

      var svg = d3.select("#my_dataviz").append("svg")
          .attr("width", width + margin.left + margin.right)
          .attr("height", height + margin.top + margin.bottom)
        .append("g")
          .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

      var layout = d3.layout.cloud()
        .size([width, height])
        .words(myWords.map(function(d) { return {text: d}; }))
        .padding(10)
        .fontSize(30)
        .on("end", draw);
      layout.start();
        
      function draw(words) {
        svg
          .append("g")
            .attr("transform", "translate(" + layout.size()[0] / 2 + "," + layout.size()[1] / 2 + ")")
            .selectAll("text")
              .data(words)
            .enter().append("text")
              .style("font-size", function(d) { return d.size + "px"; })
              .attr("text-anchor", "middle")
              .attr("transform", function(d) {
                return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
              })
              .text(function(d) { return d.text; });
      }
    } catch (err) {
      console.error("处理失败:", err.message);
      alert("文件解析错误:" + err.message);
    }
  }
  reader.readAsText(uploadButton[0].files[0]);
});
$('body').append(uploadButton);

</script>

3. 关键修改点

  • 添加了try-catch错误处理,捕获JSON解析失败或数据结构不符的情况
  • 新增Array.isArray()判断,确保myWords始终是数组类型
  • 支持两种常见JSON结构:纯数组、带数组字段的对象(可根据你的实际JSON调整字段名)

内容的提问来源于stack exchange,提问作者Mr.Serg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:27:39