我第一次使用d3.nest()函数来尝试在d3中绘制一个弦波。现在,当我嵌套年份和国家/地区时,我看到在国家/地区(如$ AUS)和年份(如1960美元)上都附加了一个“ $”符号。因此,是否期望我需要以dataByCountryAndyear ['$ AUS']的形式访问数组?
我读了这篇文章:
Include json in this d3.js calendar view?
似乎在d3 v4中是预期的行为,但是我想了解在这种情况下使用密钥访问对象的正确方法是什么。
function ready(error, country_data, lfpr_data) {
// converting strings to numbers where necessary
lfpr_data.forEach(d => {
d.year = +d.year
d.female_lfpr = +d.female_lfpr;
d.male_lfpr = +d.male_lfpr;
});
// nesting by country and year i.e for each country all years beneath it
var dataByCountryByYear = d3.nest()
.key(function(d) { return d.country; })
.key(function(d) { return d.year; })
.map(lfpr_data);
console.log(dataByCountryByYear['$AUS'])
country_data.features.forEach(each_country => {
each_country.properties.years = dataByCountryByYear[each_country.id]
});
}
我的数据如下:
year country country_name region female_lfpr male_lfpr total_lfpr
1960 ABW Aruba Latin America & Caribbean NA NA NA
1960 AFG Afghanistan South Asia NA NA NA
1960 AGO Angola Sub-Saharan Africa NA NA NA
1960 ALB Albania Europe & Central Asia NA NA NA
1960 AND Andorra Europe & Central Asia NA NA NA
1960 ARE United Arab Emirates Middle East & North Africa NA NA NA
1960 ARG Argentina Latin America & Caribbean NA NA NA
1960 ARM Armenia Europe & Central Asia NA NA NA
1960 ASM American Samoa East Asia & Pacific NA NA NA
1960 ATG Antigua and Barbuda Latin America & Caribbean NA NA NA
答案 0 :(得分:4)
您没有使用entries
,它...
将嵌套运算符应用于指定的数组,并返回键值条目的数组。 (强调我的)
相反,您使用的是map
,
将嵌套运算符应用于指定的数组,并返回嵌套的 map 。 (强调我的)
因此,nest
的结果不是数组,而是map。这是另一种对象。
话虽如此,您有两个问题:
d3.map
将自动设置以$
符号开头的键:
export var prefix = "$";
但是您不必介意该前缀(更多有关以下内容)。
由于这是地图,而不是数组,因此必须使用地图的方法,例如has
,get
或set
。使用这些方法时,您不需要使用美元符号。
以下是您的代码/数据的示例:
const csv = `year,country,country_name,region,female_lfpr male_lfpr,total_lfpr
1960,ABW,Aruba,Latin America & Caribbean,NA,NA,NA
1960,AFG,Afghanistan,South Asia,NA,NA,NA`;
const data = d3.csvParse(csv);
const dataByCountryByYear = d3.nest()
.key(function(d) {
return d.country;
})
.key(function(d) {
return d.year;
})
.map(data);
console.log(dataByCountryByYear.has("AFG"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>