Javascript D3 v.4和x2014;比较多个数据集中的值
(这是对一个我问得不够精确的问题的重新表述;对此我深表歉意) 我有一个数据比较问题。 我有两个数据集(这里简化了很多): 我试图为每个大陆(以及在第二阶段,每个国家)检索“ab”的值,条件是它们在currentNodes集中存在(作为“大陆”和“国家”),以便能够更新它们 如果我理解正确,以下仅返回currentNodes数组中的所有对象:Javascript D3 v.4和x2014;比较多个数据集中的值,javascript,d3.js,Javascript,D3.js,(这是对一个我问得不够精确的问题的重新表述;对此我深表歉意) 我有一个数据比较问题。 我有两个数据集(这里简化了很多): 我试图为每个大陆(以及在第二阶段,每个国家)检索“ab”的值,条件是它们在currentNodes集中存在(作为“大陆”和“国家”),以便能够更新它们 如果我理解正确,以下仅返回currentNodes数组中的所有对象: d3.select('#nav').selectAll('p').data(cat.continents).enter() .insert('p')
d3.select('#nav').selectAll('p').data(cat.continents).enter()
.insert('p').text(function(d) {
var filteredNodes = currentNodes.filter(function(f) {
return d.ab == f.continent;
})
return filteredNodes;})
-但我不明白为什么我不能选择以下相关值:
d3.select('#nav').selectAll('p').data(cat.continents).enter()
.insert('p').text(function(d) {
var filteredNodes = currentNodes.filter(function(f) {
return d.ab == f.continent;
})
return filteredNodes.ab;})
我很乐意找到一个解决方案,但也能理解我在这里犯了什么错。非常感谢您的帮助和宽容 在第二个示例中,您将返回一个对象数组,希望该数组只包含一项。所以你应该使用
返回filteredNodes[0]。ab
(当然,如果您的数据集没有正确填充,您可能不会得到匹配项或多个匹配项,因此可能还需要添加一些例外)在第二个示例中,您返回的是一个对象数组,希望该数组只包含一个项。所以你应该使用
返回filteredNodes[0]。ab
(当然,如果您的数据集没有正确填充,您可能不会得到匹配项或多个匹配项,因此可能还需要添加一些例外)查看您的
currentNodes
数组。其中没有名为ab
的属性。这是大陆猫的一个属性
因此,如果我正确理解您的需求,您可以在currentNodes
数组中映射大陆:
var continentList = currentNodes.map(function(d) {
return d.continent
})
并检查新阵列中是否存在ab
:
.text(function(d) {
return continentList.indexOf(d.ab) > -1 ? d.ab : "not in list";
})
这里,我使用一个三元运算符和一个字符串“not in list”来表示false条件
以下是演示:
var cat={
大陆:[{
名称:“非洲”,
ab:“AF”,
国家:[{
名称:“埃及”,
ab:“Eg”
}, {
名称:“尼日尔”,
ab:“Ng”
}]
}, {
名称:“美国”,
ab:“AM”,
国家:[{
名称:“巴西”,
ab:“Br”
}, {
名称:“加拿大”,
ab:“Ca”
}, {
名称:“美国”,
ab:“美国”
}, {
名称:“委内瑞拉”,
ab:“Vz”
}]
}, {
名称:“亚洲”,
ab:“作为”,
国家:[{
姓名:"富",,
ab:“Fo”
}, {
名称:“酒吧”,
ab:“Ba”
}]
}, {
名称:“欧洲”,
ab:“欧盟”,
国家:[{
名称:“法国”,
ab:“Fr”
}, {
名称:“德国”,
ab:“Ge”
}, {
名称:“希腊”,
ab:“Gr”
}, {
名称:“意大利”,
ab:“它”
}, {
名称:“联合王国”,
ab:“英国”
}]
}, {
名称:“大洋洲”,
ab:“OC”,
国家:[{
姓名:"富",,
ab:“Fo”
}, {
名称:“酒吧”,
ab:“Ba”
}]
}]
};
var currentNodes=[{
名称:“日本”,
大陆:“作为”,
国家:“Jp”,
x:200,
y:50
}, {
名称:“意大利”,
欧洲大陆:“欧盟”,
国家:“它”,
x:50,
y:400
}, {
名称:“博洛尼亚”,
欧洲大陆:“欧盟”,
国家:“它”,
x:180,
y:100
}, {
姓名:“佛罗伦萨”,
欧洲大陆:“欧盟”,
国家:“它”,
x:50,
y:200
}, {
名称:“德国”,
欧洲大陆:“欧盟”,
国家:“通用电气”,
x:350,
y:430
}, {
名称:“加拿大”,
大陆:“AM”,
国家:“Ca”,
x:180,
y:400
}];
var=currentNodes.map(函数(d){
返回d大陆
})
d3.选择(“正文”)。选择全部(空)
.数据(分类大陆)
.输入()
.append('p')
.文本(功能(d){
返回列表。indexOf(d.ab)>-1?d.ab:“不在列表中”;
})
看看您的currentNodes
数组。其中没有名为ab
的属性。这是大陆猫的一个属性
因此,如果我正确理解您的需求,您可以在currentNodes
数组中映射大陆:
var continentList = currentNodes.map(function(d) {
return d.continent
})
并检查新阵列中是否存在ab
:
.text(function(d) {
return continentList.indexOf(d.ab) > -1 ? d.ab : "not in list";
})
这里,我使用一个三元运算符和一个字符串“not in list”来表示false条件
以下是演示:
var cat={
大陆:[{
名称:“非洲”,
ab:“AF”,
国家:[{
名称:“埃及”,
ab:“Eg”
}, {
名称:“尼日尔”,
ab:“Ng”
}]
}, {
名称:“美国”,
ab:“AM”,
国家:[{
名称:“巴西”,
ab:“Br”
}, {
名称:“加拿大”,
ab:“Ca”
}, {
名称:“美国”,
ab:“美国”
}, {
名称:“委内瑞拉”,
ab:“Vz”
}]
}, {
名称:“亚洲”,
ab:“作为”,
国家:[{
姓名:"富",,
ab:“Fo”
}, {
名称:“酒吧”,
ab:“Ba”
}]
}, {
名称:“欧洲”,
ab:“欧盟”,
国家:[{
名称:“法国”,
ab:“Fr”
}, {
名称:“德国”,
ab:“Ge”
}, {
名称:“希腊”,
ab:“Gr”
}, {
名称:“意大利”,
ab:“它”
}, {
名称:“联合王国”,
ab:“英国”
}]
}, {
名称:“大洋洲”,
ab:“OC”,
国家:[{
姓名:"富",,
ab:“Fo”
}, {
名称:“酒吧”,
ab:“Ba”
}]
}]
};
var currentNodes=[{
名称:“日本”,
大陆:“作为”,
国家:“Jp”,
x:200,
y:50
}, {
名称:“意大利”,
欧洲大陆:“欧盟”,
国家:“它”,
x:50,
y:400
}, {
名称:“博洛尼亚”,
欧洲大陆:“欧盟”,
国家:“它”,
x:180,
y:100
}, {
姓名:“佛罗伦萨”,
欧洲大陆:“欧盟”,
国家:“它”,
x:50,
y:200
}, {
名称:“德国”,
欧洲大陆:“欧盟”,
国家:“通用电气”,
x:350,
y:430
}, {
名称:“加拿大”,
大陆:“AM”,
国家:“Ca”,
x:180,
y:400
}];
var=currentNodes.map(函数(d){
返回d大陆
})
d3.选择(“正文”)。选择全部(空)
.数据(分类大陆)
.输入()
.append('p')
.文本(功能(d){
返回列表。indexOf(d.ab)>-1?d.ab:“不在列表中”;
})
谢谢您的帮助。我试过了,但是