0

我目前正在尝试使用 D3 在波多黎各地图上构建一个等值线。使用Scott Murray 关于 Choropleths 的示例,我正在尝试将数据绑定到波多黎各的每个城市。我有一个占位符空对象来保存从 CSV 提供的数据,如下所示:

var properties = {};

然后,我继续逐行读取 CSV 文件。我将相应的值分配给一些变量,如下所示:

properties.dataID = parseFloat(data[i].id);
properties.dataMunic_Total = parseFloat(data[i].municipio_total);
//etc.

一切都很好,花花公子。我 console.log 检查数据是否存储正确:

console.log(properties.dataID);
//Displays 1, which is correct.

但是,当我尝试访问整个对象时:

console.log(properties);

它只显示 CSV 文件的最后一行。我在第一个 for 循环中运行了最后一个 console.log() 语句,在将数据分配给对象的属性之后立即运行,并且每次循环遍历 console.log() 时,它只显示 CSV 文件的最后一行.

当我尝试将对象属性分配给我的地图对象(市政当局)时,它所分配的只是 CSV 文件的最后一行。所以我尝试单独设置它们,看到这似乎有效。但是,JavaScript 抱怨该属性在对象中不存在:

obj.geometries[j].properties.year[properties.dataYear - 2000].id = properties.dataID;
Uncaught TypeError: Cannot read property 'id' of undefined

我尝试将它初始化为一个新变量:

var obj.geometries[j].properties.year[properties.dataYear - 2000].id = properties.dataID;

但后来我在控制台上得到了这个:

Uncaught SyntaxError: Unexpected identifier

除了语法错误之外,我认为这主要是因为我在每个自治市附加了一个数组,所以我每年可以保存不同的数据集......但我不明白 JavaScript 为什么会这样。

我的问题是:为什么我的对象会这样?d3.csv 有问题吗?难道我做错了什么?

4

1 回答 1

1

如果要存储多个属性,则需要使用数组(即列表)。在您使用的代码中,您一次只创建一个变量properties,而不是保存对您之前创建的变量的引用。也就是说,在循环的每次迭代中,您都会创建一个新对象,但会丢失旧对象。

如果您声明properties为一个数组,然后在循环中附加新的属性对象,您可以稍后引用它们并使用它们来绘制地图。代码看起来像这样。

var properties = [];
for(var i = 0; i < data.length; i++) {
  var property = {};
  property.dataID = parseFloat(data[i].id);
  property.dataMunic_Total = parseFloat(data[i].municipio_total);
  // ...
  properties.push(property);
}

像这样设置数据后,您应该能够按照示例中的说明进行操作。

于 2013-07-17T15:27:08.147 回答