我对JS和堆栈社区也很陌生,我很难从本地json文件中获取适合条件的值。原始json非常大,所以这些是我json的前两行;
[{
"park_name": "Acadia National Park",
"latitude": 44.35,
"longitude": -68.21,
"species_id": "ACAD-1000",
"common_names": "Moose",
"occurrence": "Present",
"abundance": "Rare",
"nativeness": "Native",
"conservation_status": null,
"location": "44.35, -68.21"
},
{
"park_name": "Acadia National Park",
"latitude": 44.35,
"longitude": -68.21,
"species_id": "ACAD-1001",
"common_names": "Northern White-Tailed Deer, Virginia Deer, White-Tailed Deer",
"occurrence": "Present",
"abundance": "Abundant",
"nativeness": "Native",
"conservation_status": null,
"location": "44.35, -68.21"
}
]
我正在尝试使用渐变点来创建传单地图。 [符合条件的物种越多,点数就越大]。我的第一层是“必须参观公园”,我想要获得occurrence = "Present"
和abundance = "Rare"
的物种(此物种存在于此处未显示的其他行中),并根据其位置将点放在地图上。每个公园都有许多适合这种条件的物种,例如在“阿卡迪亚国家公园”中有141种适合这种条件的物种,因此我只需要根据适合的物种数量对一个点进行分级。我可以得到一个物种,但不能抓住一个包含141种物种的公园的纬度和经度,而对于其他公园也一样,我有一堆物种,但只需要一个[lat, lon]
。这是我获取条件的代码;
var visit = {};
var visit_loc = {};
for (var i = 0; i < metadata.length; i++) {
var names = metadata[i].park_name;
var abundance = metadata[i].abundance;
var occurrence = metadata[i].occurrence;
var locations = metadata[i].location;
var latitude = metadata[i].latitude;
var longitude = metadata[i].longitude;
if (occurrence === "Present" && abundance === "Rare") {
if (!visit[names] && !visit_loc[location]) {
visit[names] = 1;
visit_loc[location] = 1;
} else {
visit[names]++;
visit_loc[location]++;
}
}
}
元数据是我来自本地json的回复。我从这个公式中得到的输出是这样的:
Acadia National Park: 141
Arches National Park: NaN
Badlands National Park: NaN
Big Bend National Park: NaN
Biscayne National Park: NaN
...
,对于visit_loc
,输出为:
visit_loc
{http://localhost:8000/: 10768}
http://localhost:8000/: 10768
__proto__:
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
我不知道这是什么意思。
因此,在这里,第一个公园之后的公园给了我NaN,但在我将代码更改为此之后:
if (occurrence === "Present" && abundance === "Rare") {
if(!visit[names]){
visit[names] = 1;
} else{
visit[names]++;
}
我得到输出,每个停车位的值,输出变为:
Acadia National Park: 141
Arches National Park: 132
Badlands National Park: 38
Big Bend National Park: 154
Biscayne National Park: 389
哪个好,我可以得到想要的值,但是我无法获得符合条件的公园的纬度和经度值。
很抱歉让它呆得这么久而且很复杂,这是我在这里问的第一个问题,是否有人对每个公园仅获得一次纬度和经度值有任何想法?谢谢。
答案 0 :(得分:0)
首先,我认为您的数据集结构错误。您不能将公园数据与物种数据混合在一起。这是您首先遇到此问题的根本原因。还要检查您访问元素的方式,它可以比使用for循环更简单。无论如何,让我们将其放在一边,我将继续尝试解决问题的最后一个遗漏部分。
假设您拥有符合条件的公园名称,则只需在对象数组中搜索其名称并返回其坐标即可:
function getParkLocationByName(parkName) {
let {latitude, longitude} = data.find(park => park.park_name === parkName);
return {latitude, longitude};
}
let coords = getParkLocationByName('Acadia National Park');
console.log(coords)
请注意,这段代码中的“数据”是您的原始json。