我有一个像这样的json文件:
[
{
"countryName": "Austria",
"countryID": "AT",
"countryPopulation": 8451860,
"regions":[
{
"regionName": "Burgenland (AT)",
"regionID": "AT11",
"regionPopulation": 286691
},
{
"regionName": "Niederösterreich",
"regionID": "AT12",
"regionPopulation": 1618592
},
{
"regionName": "Wien",
"regionID": "AT13",
"regionPopulation": 1741246
},
{
"regionName": "Kärnten",
"regionID": "AT21",
"regionPopulation": 555473
},
{
"regionName": "Steiermark",
"regionID": "AT22",
"regionPopulation": 1210971
},
{
"regionName": "Oberösterreich",
"regionID": "AT31",
"regionPopulation": 1418498
},
{
"regionName": "Salzburg",
"regionID": "AT32",
"regionPopulation": 531898
},
{
"regionName": "Tirol",
"regionID": "AT33",
"regionPopulation": 715888
},
{
"regionName": "Vorarlberg",
"regionID": "AT34",
"regionPopulation": 372603
}
]
},
{
"countryName": "Belgium",
"countryID": "BE",
"countryPopulation": 11161642,
"regions":[
{
"regionName": "Région de Bruxelles-Capitale",
"regionID": "BE10",
"regionPopulation": 1174624
},
{
"regionName": "Prov. Antwerpen",
"regionID": "BE21",
"regionPopulation": 1802309
},
{
"regionName": "Prov. Limburg (BE)",
"regionID": "BE22",
"regionPopulation": 855963
},
{
"regionName": "Prov. Oost-Vlaanderen",
"regionID": "BE23",
"regionPopulation": 1465150
},
{
"regionName": "Prov. Vlaams-Brabant",
"regionID": "BE24",
"regionPopulation": 1103737
},
{
"regionName": "Prov. West-Vlaanderen",
"regionID": "BE25",
"regionPopulation": 1177567
},
{
"regionName": "Prov. Brabant Wallon",
"regionID": "BE31",
"regionPopulation": 389479
},
{
"regionName": "Prov. Hainaut",
"regionID": "BE32",
"regionPopulation": 1332489
},
{
"regionName": "Prov. Liège",
"regionID": "BE33",
"regionPopulation": 1095977
},
{
"regionName": "Prov. Luxembourg (BE)",
"regionID": "BE34",
"regionPopulation": 278278
},
{
"regionName": "Prov. Namur",
"regionID": "BE35",
"regionPopulation": 486069
}
]
},
{
"countryName": "Bulgaria",
"countryID": "BG",
"countryPopulation": 7284552,
"regions":[
{
"regionName": "Severozapaden",
"regionID": "BG31",
"regionPopulation": 823469
},
{
"regionName": "Severen tsentralen",
"regionID": "BG32",
"regionPopulation": 844511
},
{
"regionName": "Severoiztochen",
"regionID": "BG33",
"regionPopulation": 957460
},
{
"regionName": "Yugoiztochen",
"regionID": "BG34",
"regionPopulation": 1067981
},
{
"regionName": "Yugozapaden",
"regionID": "BG41",
"regionPopulation": 2128783
},
{
"regionName": "Yuzhen tsentralen",
"regionID": "BG42",
"regionPopulation": 1462348
}
]
},
...
然后我有两个变量:cs
和rs
。在任何时候,只有其中一个与null不同。
cs
包含用户选择的国家/地区,rs
包含用户选择的区域。
如前所述,如果cs
与null不同,则rs
为空,反之亦然。
这是因为用户可以从地图中选择国家/地区或选择国家/地区。
我的目标是创建一个复选框(或类似的东西,我仍然要考虑它),它允许您选择超出当前区域(国家/地区),以及其他区域(国家/地区),以便您可以比较数据。 / p>
我想要的是:
if cs != null
- >我想获得一个国家列表(Json文件中的所有国家/地区)
if rs != null
- >我想获得rs所属国家的地区列表。
这是我试图做的。
// global variables
cs = null; // if it is not null, the user has selected this country
csi = null; // country id
rs = null; // if it is not null, the user has selected this region
rsi = null; // region id
currentCountries = null; // list of all countries
currentRegions = null; // list of regions in the selected country
/**
* Function that creates line charts only when a country or a region is clicked.
*/
function createLineChart(antigenSelected, yearSelected, countrySelected, countrySelectedId, regionSelected, regionSelectedId) {
defineLines(antigenSelected, yearSelected, countrySelected, countrySelectedId, regionSelected, regionSelectedId);
}
function defineLines(antigenSelected, yearSelected, countrySelected, countrySelectedId, regionSelected, regionSelectedId) {
/**
* To know if the user has clicked on the country or region, check that the selected region belongs to the selected country:
* - if it belongs to us -> the user has clicked on the selected region
* - if it does not belong to us -> the user has clicked on the selected country.
* At any moment only one of the two possibilities is assigned (the other is null).
*/
cs = null; // if it is not null, the user has selected this country
csi = null; // country id
rs = null; // if it is not null, the user has selected this region
rsi = null; // region id
// if the user has selected a region
if(regionSelectedId != null && countrySelectedId == regionSelectedId.substring(0, 2)) {
rs = regionSelected;
rsi = regionSelectedId;
}
// if the user has selected a country
else {
cs = countrySelected;
csi = countrySelectedId;
}
console.log("countrySelected: " + cs);
console.log("regionSelected: " + rs);
/**
* Load json with countries and regions.
*/
d3.json("../Project2/data/json/countriesAndRegions.json", function(error, countriesAndRegions) {
if(error) {
console.log("*** ERROR LOADING FILES: " + error + " ***");
throw error;
}
countriesAndRegions.forEach(function(c) {
allCountries.push(c.countryName);
currentRegions = c.regions;
});
currentRegions.forEach(function(r) {
//console.log(r.regionName);
});
console.log(allCountries);
console.log(currentRegions);
//var nested = d3.nest()
// I have to nest data?
//.object(currentRegions);
});
}
显然这段代码不起作用。或者更确切地说,它适用于allCountries
但不适用于currentRegions
。
我怎么解决?我应该使用nest()
方法吗?
我想要的是:
cs != null
- >得到所有国家rs != null
- >获取rs
地区所属国家/地区的所有地区。非常感谢
为了简化,假设我有这个json文件。
var users = [
{
name: 'Corbin',
age: 20,
favoriteFoods: ['ice cream', 'pizza'],
other: [
{
a: 12,
b: "apple"
},
{
a: 15,
b: "pear"
}
]
},
{
name: 'John',
age: 25,
favoriteFoods: ['ice cream', 'skittle'],
other: [
{
a: 0,
b: "cinnamon"
},
{
a: 854,
b: "ginger"
},
{
a: 24,
b: "salt"
}
]
}
];
然后我有一个包含字符串ginger
的变量。如何获取列表[cinnamon, ginger, salt]
?
如果我有一个包含字符串Corbin
的变量,我该如何获取列表[Corbin, John]
?
答案 0 :(得分:1)
例如,我有一个与json数组相同的json数组样本:
var users = [{name: 'Corbin', age: 20, favoriteFoods: ['ice cream', 'pizza']},
{name: 'John', age: 25, favoriteFoods: ['ice cream', 'skittle']}];
我必须访问第二个用户的age属性,然后:
users[1].age
可以使用。
如果你必须访问第二个" favoriteFood"然后你应该使用第一个用户:
users[0].favoriteFoods[2]
。
根据您的要求,我将发布另一个示例代码:
答案 1 :(得分:1)
好的,这个要求需要根据值获取 key
,并且我提出了一种使用递归调用的方法(虽然可能有更好的方法)。
步骤(简化):
row
。row
Object.keys(row)
个密钥
row
。row[key]
是对象,只需找到与传递的 value
匹配的相应键/值对(主要值 - cs或rs )并返回关联的key
。
我已经使用了break
个语句,最后根据关联的key
使用了 array.map()。row[key]
是数组,请使用递归调用并执行上述步骤。希望这能解释代码。如果您有任何疑问,请告诉我。 :)
var data = [
{
"countryName": "Austria",
"countryID": "AT",
"countryPopulation": 8451860,
"regions":[
{
"regionName": "Burgenland (AT)",
"regionID": "AT11",
"regionPopulation": 286691
},
{
"regionName": "Niederösterreich",
"regionID": "AT12",
"regionPopulation": 1618592
},
{
"regionName": "Wien",
"regionID": "AT13",
"regionPopulation": 1741246
},
{
"regionName": "Kärnten",
"regionID": "AT21",
"regionPopulation": 555473
},
{
"regionName": "Steiermark",
"regionID": "AT22",
"regionPopulation": 1210971
},
{
"regionName": "Oberösterreich",
"regionID": "AT31",
"regionPopulation": 1418498
},
{
"regionName": "Salzburg",
"regionID": "AT32",
"regionPopulation": 531898
},
{
"regionName": "Tirol",
"regionID": "AT33",
"regionPopulation": 715888
},
{
"regionName": "Vorarlberg",
"regionID": "AT34",
"regionPopulation": 372603
}
]
},
{
"countryName": "Belgium",
"countryID": "BE",
"countryPopulation": 11161642,
"regions":[
{
"regionName": "Région de Bruxelles-Capitale",
"regionID": "BE10",
"regionPopulation": 1174624
},
{
"regionName": "Prov. Antwerpen",
"regionID": "BE21",
"regionPopulation": 1802309
},
{
"regionName": "Prov. Limburg (BE)",
"regionID": "BE22",
"regionPopulation": 855963
},
{
"regionName": "Prov. Oost-Vlaanderen",
"regionID": "BE23",
"regionPopulation": 1465150
},
{
"regionName": "Prov. Vlaams-Brabant",
"regionID": "BE24",
"regionPopulation": 1103737
},
{
"regionName": "Prov. West-Vlaanderen",
"regionID": "BE25",
"regionPopulation": 1177567
},
{
"regionName": "Prov. Brabant Wallon",
"regionID": "BE31",
"regionPopulation": 389479
},
{
"regionName": "Prov. Hainaut",
"regionID": "BE32",
"regionPopulation": 1332489
},
{
"regionName": "Prov. Liège",
"regionID": "BE33",
"regionPopulation": 1095977
},
{
"regionName": "Prov. Luxembourg (BE)",
"regionID": "BE34",
"regionPopulation": 278278
},
{
"regionName": "Prov. Namur",
"regionID": "BE35",
"regionPopulation": 486069
}
]
},
{
"countryName": "Bulgaria",
"countryID": "BG",
"countryPopulation": 7284552,
"regions":[
{
"regionName": "Severozapaden",
"regionID": "BG31",
"regionPopulation": 823469
},
{
"regionName": "Severen tsentralen",
"regionID": "BG32",
"regionPopulation": 844511
},
{
"regionName": "Severoiztochen",
"regionID": "BG33",
"regionPopulation": 957460
},
{
"regionName": "Yugoiztochen",
"regionID": "BG34",
"regionPopulation": 1067981
},
{
"regionName": "Yugozapaden",
"regionID": "BG41",
"regionPopulation": 2128783
},
{
"regionName": "Yuzhen tsentralen",
"regionID": "BG42",
"regionPopulation": 1462348
}
]
}
];
var cs = 'Belgium', rs = 'Yuzhen tsentralen';
// cs is not null, get all countries but first find the key
var mainKey = null;
function getKey(array, value) {
for(var i=0; i<array.length; i++) {
var flag = false, row = array[i], keys = Object.keys(row);
for(var j=0; j<keys.length; j++) {
var key = keys[j];
if(Array.isArray(row[key])) {
getKey(row[key], value);
} else if(row[key] === value) {
mainKey = key;
flag = true;
console.log(array.map(function(d) { return d[mainKey];}));
break;
}
}
if(flag) {
break;
}
}
}
if(cs != null) {
getKey(data, cs);
}
if(rs != null) {
getKey(data, rs);
}
/********************
This is what I thought earlier about the requirement, use it if you find it helpful
*************/
/*
// with underscore.js
var row = _.findWhere(data, {countryName: cs});
if(row) {
console.log(row["regions"]);
console.log(row["regions"].map(function(r) { return r["regionName"]; }));
}
// without underscore.js
var index = null;
for(var i=0; i<data.length; i++) {
if(data[i]['countryName'] === cs) {
index = i;
break;
}
}
console.log(data[index]["regions"]);
console.log(data[index]["regions"].map(function(r) { return r["regionName"]; }));
*/
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
答案 2 :(得分:0)
主要问题在于这段代码:
regionSelectedId != null && countrySelectedId == regionSelectedId.substring(0, 2)
由于countrySelectedId
在null
为regionSelectedId
时始终为null
,因此该表达式将始终返回false。您只需将其修改为有用的东西。