【问题标题】:How to merge data from D3.js Topojson to defined set to set class如何将 D3.js Topojson 中的数据合并到定义的集合到集合类
【发布时间】:2017-09-13 23:30:20
【问题描述】:

所以我使用 D3.js 的 Topojson 功能来创建 svg 世界地图。尽管对 d3 来说相对较新,但到目前为止,我已经成功地弄清楚了规模和一切。我遇到的问题是尝试将 topojson 文件中的数据与我定义的一些集合合并或过滤。我将省略用于投影的函数。到目前为止,这是我所拥有的:

var svg = d3.select("#map svg");
var regions = [
    {
        region: 'low',
        set: d3.set([ "USA", "CAN" ])
    },
    {
        region: 'med',
        set: d3.set([ "AUS" ])
    },
    {
        region: 'high',
        set: d3.set([ "RUS" ])
    }
];
d3.json("site/js/topo.json", function(error, topology) {
    // INDIVIDUAL COUNTRIES
    svg.selectAll("path")
        .data(topojson.feature(topology, topology.objects.worldByIso).features)
        .enter()
        .append("path")
        .attr("data-iso", function(d){ 
            return d.properties.iso;
        })
        .attr("d", path);
});

我能够将 d.properties.iso 值从 topojson 文件返回到数据属性,但我真正想做的是对照“区域”数组检查该 iso 属性以返回区域(低、中或高)如果它与集合匹配。

理想情况下,该解决方案不需要每次都循环通过“区域”进行检查,因此可以快速处理它。希望这一切都有意义,我正在写这篇文章,因为我加班了!

【问题讨论】:

    标签: javascript d3.js topojson


    【解决方案1】:

    Array.reduce

    我想你想要Array.reduce()。这将使您可以将数组折叠为单个值。我将您的 d3.sets 更改为简单数组,因此我可以使用 contains() 方法,但快速浏览 d3 文档看起来他们的集合有 has()

    var regions = [{
        region: 'low',
        set: ["USA", "CAN"]
      },
      {
        region: 'med',
        set: ["AUS"]
      },
      {
        region: 'high',
        set: ["RUS"]
      }
    ];
    
    let getRegion = r => regions.reduce((a, c) => c.set.includes(r) ? c.region : a, null);
    
    console.log(getRegion('AUS'));
    console.log(getRegion('USA'));
    console.log(getRegion('EUR'));

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 1970-01-01
      • 2012-06-14
      • 2021-11-12
      • 1970-01-01
      • 2011-04-07
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多