Получить условные значения от Json, группа уникальных - PullRequest
1 голос
/ 10 марта 2019

Я довольно новичок в 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

Что хорошо, я получаю значения, которые хочу, но не могу получить значения широты и долготы для парков, соответствующих критериям.

Извините за сохранение этого такдолго и сложно, это первый вопрос, который я здесь задаю, есть ли у кого-нибудь идеи о том, как получить значения широты и долготы для каждого парка только один раз.Спасибо.

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Вам нужно увеличить visit и visit_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]++;
    }
}
0 голосов
/ 10 марта 2019

Прежде всего, я думаю, что ваш набор данных неправильно структурирован. Вы не можете смешивать данные парка с данными вида. Это основная причина того, что у вас возникла эта проблема. Также проверьте способ доступа к элементам, это можно сделать намного проще, чем с помощью цикла 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...