Проблема с получением определенного поля из выходных данных OpenWeatherMap API через JS / XMLHttpRequest

#javascript #concatenation #openweathermap

#javascript #конкатенация #openweathermap

Вопрос:

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

 ajaxGet("https://api.openweathermap.org/data/2.5/onecall?lat=4.6097amp;lon=-74.0817amp;exclude=current,minutely,hourly,alertsamp;appid=APPIDamp;units=metric", function (response) {

      var data = JSON.parse(response);
      console.log(data);
      
      var temperature = document.createElement("h6");
      temperature.textContent = data.daily[0].temp.max   "°"   " / "   data.daily[0].temp.min   "°";

      document.getElementById("temperaturaBogVier").appendChild(temperature);
  });
  

И вот пример того, как выглядит вывод API (я показываю здесь только первую итерацию, но всего их не менее 6, https://api.openweathermap.org/data/2.5/onecall?lat=4.6097amp;lon=-74.0817amp;exclude=current,minutely,hourly,alertsamp;appid=APPIDamp;units=metric):

 {"lat":4.61,"lon":-74.08,"timezone":"America/Bogota","timezone_offset":-18000,"daily":
[
    
{"dt":1600876800,
 "sunrise":1600857917,
 "sunset":1600901504,
 "temp":{"day":18.14,"min":8.99,"max":18.14,"night":12.08,"eve":15.45,"morn":8.99},
 "feels_like":{"day":17,"night":11.02,"eve":14.6,"morn":7.58},
 "pressure":1017,"humidity":54,
 "dew_point":8.69,
 "wind_speed":1.2,
 "wind_deg":164,
 "weather":[{"id":501,"main":"Rain","description":"moderate rain","icon":"10d"}],
 "clouds":82,
 "pop":0.94,
 "rain":5.85,
 "uvi":15.14}

]
}
  

Итак, как вы можете видеть, я могу печатать в своем HTML данные, содержащиеся в «data.daily [0].temp.», но это работает только для первого набора полей, и я понятия не имею, как выбрать конкретную итерацию. Я уверен, что мне чего-то не хватает в конкате, но пока ничего из того, что я пробовал, не сработало.

Любая помощь будет высоко оценена и вознаграждена воображаемой вафлей. СПАСИБО: D

Комментарии:

1. Вы имеете в виду, например data.daily[1] , data.daily[2] , и т.д.? Или что вы имеете в виду под конкретной итерацией?

2. @DMalan Ну, на выходе есть массив в data.daily[0], который содержит только один список, поэтому нет data.daily[1], data.daily [2] и т.д.. Я пытаюсь получить доступ к элементам, содержащимся в этом списке, но поскольку он сам по себе не является массивом, я не очень уверен, как это сделать … спасибо за ваш ответ, кстати

3. Вы можете рассмотреть возможность удаления или замены appid=XXXX части URL-адреса запроса. Это ваш личный ключ API для OpenWeather, которым вы не должны делиться.

4. @DiegoP. data.daily[0] это объект и data.daily массив, который вы можете индексировать с data.daily[1] помощью , data.daily[2] , и т.д.

5. @DMalan спасибо, вы были абсолютно правы. Я вызывал только одну строку, поэтому я не смог получить остальную информацию. Приветствия!

Ответ №1:

Температуры за каждый день data.daily определяются как массив объектов JavaScript. Вы можете просто получить к ним доступ по их индексу, который указывает их положение в массиве.

 data.daily[0] // First element
data.daily[1] // Second element
data.daily[2] // Third element
  

После того, как вы выбрали объект в массиве, вы можете получить доступ к определенным значениям, таким как data.daily[2].temp.max .

Самое классное в массивах то, что вы можете повторять их с помощью цикла. Это сэкономит вам много времени на написание, если вы хотите распечатать каждую температуру на каждый день:

 ajaxGet("https://api.openweathermap.org/data/2.5/onecall?lat=4.6097amp;lon=-74.0817amp;exclude=current,minutely,hourly,alertsamp;appid=YOUR_API_KEY_HEREamp;units=metric", function (response) {

  var data = JSON.parse(response);
  console.log(data);

  data.daily.forEach(function (date) {
    var temperature = document.createElement("h6");
    temperature.textContent = date.temp.max   "°"   " / "   date.temp.min   "°";

    document.getElementById("temperaturaBogVier").appendChild(temperature);
  })
});
  

Пожалуйста, обратите внимание: я удалил appid=XXXXX часть URL-адреса запроса, потому что он содержит ваш личный ключ API для OpenWeather, которым вы не должны делиться публично.

Комментарии:

1. Спасибо за ваше объяснение, я неправильно обрабатывал массив. Это работает отлично!

Ответ №2:

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

Вот способ сделать это

 ajaxGet("https://api.openweathermap.org/data/2.5/onecall?lat=4.6097amp;lon=-74.0817amp;exclude=current,minutely,hourly,alertsamp;units=metric", function (response) {
    var data = JSON.parse(response);
    console.log(data);

    data.daily
        .map(datapoint => datapoint.temp) //get the temp value/object from each datapoint
        .map(temp => { //create an element and add each max/min value to that element's textContent
            const temperature = document.createElement("h6");
            temperature.textContent = temp.max   "° / "   temp.min   "°";
            return temperature;
        })
        .forEach(element => { //add each of the elements created in the previous map to the desired element
            document.getElementById("temperaturaBogVier").appendChild(element);
        });
});
  

Как указано в другом ответе, я также удалил параметр запроса app-id