Javascript 从Json获取条件值,将唯一值分组

Javascript 从Json获取条件值,将唯一值分组,javascript,json,if-statement,leaflet,Javascript,Json,If Statement,Leaflet,我也是JS和stack社区的新手,我很难从本地json文件中获取符合条件的值。原始的json非常大,所以这是我的json的前两行 [{ "park_name": "Acadia National Park", "latitude": 44.35, "longitude": -68.21, "species_id": "ACAD-1000", "common_names": "Moose", "occu

我也是JS和stack社区的新手,我很难从本地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”
furnity=“珍稀”
(这存在于此处未显示的其他行中),并根据它们的位置将点放在地图上。每个公园中都有许多物种符合这一条件,例如“阿卡迪亚国家公园”中有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]++;
    }
  }
}
对于
访问_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
这很好,我得到了我想要的值,但是我不能得到符合标准的公园的纬度和经度值


抱歉,让它这么长,太复杂了,这是我在这里问的第一个问题,有没有人知道如何只获取一次每个公园的纬度和经度值。谢谢。

您需要独立增加
访问
访问_loc
。您的代码仅在两个元素尚未设置时将它们设置为
1
。如果未设置
visit[names]
,但设置了
visit[locations]
,则代码假定两者都已初始化,并尝试将它们都递增。对于
visit[names]
,此操作失败,因此您将在那里获得
NaN

if (occurrence === "Present" && abundance === "Rare") {
    if(!visit[names]){
        visit[names] = 1;                                  
    } else{
        visit[names]++;                                
    }
    if (!visit_loc[locations]) {
        visit_loc[locations] = 1;
    } else {
        visit_loc[locations]++;
    }
}

首先,我认为您的数据集结构错误。你不能把公园数据和物种数据混为一谈。这是你产生这个问题的根本原因。还要检查访问元素的方式,这比使用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。

当您访问时,
visit_loc[location]=1没有变量
位置
。变量名是
locations
。是的,它工作了,并且理解了我的错误。非常感谢您对Barmar的解释:)哦,“.find”返回符合条件的第一个元素,我不知道,似乎更简单,谢谢:)@BoraCobanoglu别忘了接受最能解决问题的答案。
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)