[英]Get informations from JSON
我有一个像这样的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
为null,反之亦然。 这是因为用户可以从地图中选择国家或国家的区域。
我的目标是创建一个复选框(或类似的东西,我仍然要考虑一下),该复选框使您可以选择当前区域(国家)之外的其他区域(国家),以便您可以比较数据。
我想要的是:
如果cs != null
>我想获取国家列表(Json文件中的所有国家)
如果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]
?
例如我有一个与您的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]
。
根据您的要求,我将发布另一个示例代码:
好的,此要求要求根据值来获取key
,并且我想出了一种使用递归调用的方法(不过可能有更好的方法)。
步骤( 简化 ):
row
。 Object.keys(row)
获取row
键 row
所有键。 row[key]
是一个对象,只需找到与传递的value
(主值-cs或rs )匹配的适当的键/值对,然后返回关联的key
。 我已经使用了break
语句,最后使用了基于关联key
的array.map() 。 row[key]
是一个Array ,请使用递归调用并执行上述步骤。 希望这能解释代码。 如果您有任何疑问,请告诉我。 :)
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"]; })); */
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
主要问题在这段代码中:
regionSelectedId != null && countrySelectedId == regionSelectedId.substring(0, 2)
由于当regionSelectedId
为null
时countrySelectedId
将始终为null
,因此该表达式将始终返回false。 您只需要将其修改为有用的内容即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.