2 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
我建議使用 response-promise-native 來(lái)允許使用 async/await。這將允許我們遍歷城市列表并將每個(gè)城市的天氣數(shù)據(jù)附加到城市詳細(xì)信息(名稱和國(guó)家/地區(qū))。
一旦我們有了這些數(shù)據(jù),我們就可以進(jìn)行您提到的處理,我們可以獲得最高和最低溫度(請(qǐng)注意,溫度以開爾文為單位,因此我們將轉(zhuǎn)換為攝氏度。)
重要的是要指出我按本地日期分組,如果您希望按UTC 日期分組,那么您應(yīng)該更改該行:
let timeOffset = entry.dt + result.weatherResponse.city.timezone;
到
let timeOffset = entry.dt;
這是解釋數(shù)據(jù)的一種稍微不同的方式!
我現(xiàn)在已更新為按日期分組,結(jié)果如下所示:
按當(dāng)?shù)厝掌诜纸M:
Date,Highest Temperature,Lowest Temperature,Cities With Rain
2019-11-01,Dubai,Oslo,"Paris,Berlin"
2019-11-02,Singapore,Oslo,"Lisbon,Paris,Berlin,Singapore"
2019-11-03,Singapore,Oslo,"Lisbon,Paris,Berlin,Athens,Singapore"
2019-11-04,Singapore,Oslo,"Lisbon,Paris,Berlin,Athens"
2019-11-05,Singapore,Oslo,"Lisbon,Paris,Berlin,Singapore"
2019-11-06,Singapore,Oslo,"Paris,Berlin,Singapore"
2019-11-07,Seoul,Seoul,""
按 UTC 日期分組:
Date,Highest Temperature,Lowest Temperature,Cities With Rain
2019-11-01,Dubai,Oslo,"Paris,Berlin"
2019-11-02,Singapore,Oslo,"Lisbon,Paris,Berlin,Singapore"
2019-11-03,Singapore,Oslo,"Lisbon,Paris,Berlin,Athens,Singapore"
2019-11-04,Singapore,Oslo,"Lisbon,Paris,Berlin,Athens"
2019-11-05,Singapore,Oslo,"Lisbon,Paris,Berlin,Singapore"
2019-11-06,Singapore,Oslo,"Paris,Berlin,Singapore"
代碼:
const rp = require("request-promise-native");
const cities = {
0: ['Jerusalem', 'il'],
1: ['New York', 'us'],
2: ['Dubai', 'ae'],
3: ['Lisbon', 'pt'],
4: ['Oslo', 'no'],
5: ['Paris', 'fr'],
6: ['Berlin', 'de'],
7: ['Athens', 'gr'],
8: ['Seoul', 'kr'],
9: ['Singapore', 'sgp'],
}
async function getWeatherForCities() {
let results = [];
for (let [city, countryCode] of Object.values(cities)) {
console.log(`Getting weather for city: ${city}, country: ${countryCode}...`);
let weatherResponse = await rp({ url: `http://api.openweathermap.org/data/2.5/forecast?q=${city},${countryCode}&mode=json&appid=${apiKey}`, json: true});
results.push ({ city, countryCode, list: weatherResponse.list, weatherResponse });
}
let summary = results.map(res => {
return { city: res.city, countryCode: res.countryCode,
maxTemperature: getMaxTemperatureCelsius(res.list),
minTemperature: getMinTemperatureCelsius(res.list),
totalRainfall: getTotalRainFall(res.list)
}});
console.log("Summary (over forecasting interval): ", summary);
console.log("Result with the highest temperature: ", [...summary].sort((resA, resB) => resB.maxTemperature - resA.maxTemperature)[0]);
console.log("Result with the lowest temperature: ", [...summary].sort((resA, resB) => resA.minTemperature - resB.minTemperature)[0]);
console.log("Cities with rain: ", summary.filter(res => res.totalRainfall).map(res => res.city));
// Group by date (local) and city
let resultsGroupedByDateAndCity = {};
results.forEach(result => {
result.list.forEach(entry => {
let timeOffset = entry.dt + result.weatherResponse.city.timezone;
let date = new Date(timeOffset * 1000);
date.setHours(0,0,0,0);
let dateKey = date.toISOString().substring(0,10);
if (!resultsGroupedByDateAndCity[dateKey]) resultsGroupedByDateAndCity[dateKey] = {};
if (!resultsGroupedByDateAndCity[dateKey][result.city]) resultsGroupedByDateAndCity[dateKey][result.city] = [];
resultsGroupedByDateAndCity[dateKey][result.city].push(entry);
});
});
// Run through the keys.
let csvLines = ["Date,Highest Temperature,Lowest Temperature,Cities With Rain"];
for (let [date, obj] of Object.entries(resultsGroupedByDateAndCity)) {
let dailySummary = Object.entries(obj).map(([city, dayList]) => {
return { city,
maxTemperature: getMaxTemperatureCelsius(dayList),
minTemperature: getMinTemperatureCelsius(dayList),
totalRainfall: getTotalRainFall(dayList)
}});
console.log("Details for date " + date + ": ");
let resultWithHighestTemperature = [...dailySummary].sort((resA, resB) => resB.maxTemperature - resA.maxTemperature)[0];
let resultWithLowestTemperature = [...dailySummary].sort((resA, resB) => resA.minTemperature - resB.minTemperature)[0];
let citiesWithRain = dailySummary.filter(res => res.totalRainfall).map(res => res.city);
console.log("Result with the highest temperature: ", resultWithHighestTemperature);
console.log("Result with the lowest temperature: ", resultWithLowestTemperature);
console.log("Cities with rain: ", citiesWithRain);
csvLines.push([date, resultWithHighestTemperature.city, resultWithLowestTemperature.city, '"' + citiesWithRain.join(",") + '"'].join(","));
}
console.log("CSV result:\n", csvLines.join("\n"));
}
function KelvinToCelsius(kelvin) {
return (kelvin - 273.15);
}
// Return the max temperature for the forecast
function getMaxTemperatureCelsius(responseList) {
// Get a list of the max temperatures for the forecast.
const maxTemps = responseList.map(entry => Number(entry.main.temp_max));
return KelvinToCelsius(Math.max(...maxTemps));
}
// Return the min temperature for the forecast
function getMinTemperatureCelsius(responseList) {
// Get a list of the min temperatures for the forecast.
const minTemps = responseList.map(entry => Number(entry.main.temp_min));
return KelvinToCelsius(Math.min(...minTemps));
}
// Return the total rainfall for the forecast
function getTotalRainFall(responseList) {
// Get a list of the min temperatures for the forecast.
const rain = responseList.map(entry => { return entry.rain ? Number(entry.rain["3h"]): 0 });
return rain.reduce((sum, val) => sum + val, 0)
}
getWeatherForCities();

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以使用它Promise.all來(lái)實(shí)現(xiàn)這一點(diǎn)。
Promise.all 返回一個(gè)單一的 Promise,當(dāng)作為可迭代對(duì)象傳遞的所有承諾都已解決或可迭代對(duì)象不包含任何承諾時(shí),該 Promise 會(huì)解決。
const getData = (url) => {
return fetch(url)
.then(data => data.json())
.then(jsonData => jsonData)
.catch(err => {
console.log("Error while resolving the promise for url", url);
});
}
let arr = [1, 2, 4, 5, 6, 7];
const cities = {
0: ['Jerusalem', 'il'],
1: ['New York', 'us'],
2: ['Dubai', 'ae'],
3: ['Lisbon', 'pt'],
4: ['Oslo', 'no'],
5: ['Paris', 'fr'],
6: ['Berlin', 'de'],
7: ['Athens', 'gr'],
8: ['Seoul', 'kr'],
9: ['Singapore', 'sgp'],
}
const apiKey = "[retracted]";
Promise.all(Object.keys(cities).map(id => {
let url = `http://api.openweathermap.org/data/2.5/forecast?q=${cities[id][0]},${cities[id][1]}&mode=json&appid=${apiKey}`;
return getData(url);
}))
.then(results => {
// results is an array that contains the result of each api call
// so you can perform the action that you need here..
results.map(result => {
console.log(result['city']['name']);
});
})
.catch(err => {
// Handle the error..
console.log(err);
});
添加回答
舉報(bào)