Javascript D3 v.4和x2014;比较多个数据集中的值

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')

(这是对一个我问得不够精确的问题的重新表述;对此我深表歉意)

我有一个数据比较问题。 我有两个数据集(这里简化了很多):

我试图为每个大陆(以及在第二阶段,每个国家)检索“ab”的值,条件是它们在currentNodes集中存在(作为“大陆”和“国家”),以便能够更新它们

如果我理解正确,以下仅返回currentNodes数组中的所有对象:

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:“不在列表中”;
})

谢谢您的帮助。我试过了,但是