如何设置我的变量,以便 D3 数据更新找到正确的对象属性

How to set my variable so D3 data update finds the right object property?

本文关键字:更新 数据 属性 对象 D3 以便 何设置 设置 变量 我的      更新时间:2023-09-26

我有一些单选按钮可以通过 D3 与 SVG 交互......

<ul>
 <li><input type="radio" name="xyz" onclick="updateMap('someProp1')" />Some label</li>
 <li><input type="radio" name="xyz" onclick="updateMap('someProp2')" />Some label</li>
 <li><input type="radio" name="xyz" onclick="updateMap('someProp3')" />Some label</li>
 etc...

我有这样的数据...

var myData = {
{
  "title" : "Some Title",
  "desc" : "Some description",
  "states" : [    {
      "st" : "AK",
      "someProp1" : 0.067,
      "someProp2" : 0.01,
      "someProp3" : 0.468
    },
    {
      "st" : "MI",
      "someProp1" : 0.067,
      "someProp2" : 0.01,
      "someProp3" : 0.468
    },
etc...
}

使用 D3,我将 myData 绑定到一堆 SVG 路径组(即美国各州的形状(,然后将这些组绘制为 choropleth,并构建相应的地图图例。

当有人单击单选按钮时,我需要重新绘制 SVG 组、更改图例并更新其他一些内容。通过更简单的可视化,我只是使用了一组 if/else 语句来完成工作。这样。。。

function updateMap(whatSelection){
  theSVGshapes.attr({
   'height' : function(d){
     if (whatSelection === 'someProp1') { return h - yScale(d.someProp1); }
     else if (whatSelection === 'someProp2') { return h - yScale(d.someProp2); }
     etc....

但是对于这种蛮力方法,我有太多的选择。我真的需要无缝地使用通过单选按钮触发函数时传递的值。像...

function updateMap(whatSelection){
  theSVGshapes.attr({
   'height' : function(d){ return d.whatSelection; }
   etc.....

当然,这是行不通的。控制台告诉我 d 未定义。在其他问题中,我真的要求它将高度设置为d.'someProp1'。

所以,这是一个很长的问法,我不太知道如何表达......这可能就是为什么我在StackExchange的其他地方找不到答案的原因。

即(好吧,尽我所能命名(:如何将变量设置为等于对象的属性值,以便我可以在 D3 中的多个重绘命令中使用该变量?

原则上,有两种方法可以访问对象中的属性值。第一种形式是你在代码中使用的形式:

d.attribute

如果属性的名称是静态的,则此方法可以正常工作。如果不是,第二种形式更好:

d["attribute"]

它实现了完全相同的事情,除了你可以传递任何(动态生成的(字符串。所以在您的情况下,您需要使用

d[whatSelection]