【发布时间】:2022-01-08 21:26:52
【问题描述】:
所以我试图在我的 Flask 应用程序中实现一个搜索栏,它将列出用户输入的城市,并且存在于天气 API 的 JSON API 结果中。
我正在关注一个教程,并且基本上与 ths 具有相同的代码:https://codepen.io/jamesqquick/pen/XWJxBQv
但是,在我的实现中,.filter() 和 .map() 函数不起作用,我收到以下错误: TypeError for map() and filter()
我该如何解决这个问题?
这是我的代码(代码第一部分中的常规 generateHTML 已经可以获取当前天气数据,只有“搜索栏”部分有问题):
let currentType = "current.json";
let userCity = "London";
const apiData = {
url: "http://api.weatherapi.com/v1",
type: `${currentType}`,
key: "40cd513af8aa446484a92837213011",
city: `${userCity}`,
};
const { url, type, key, city } = apiData;
const apiUrl = `${url}/${type}?key=${key}&q=${city}`;
console.log("apiUrl:");
console.log(apiUrl);
fetch(apiUrl)
.then((data) => {
if (data.ok) {
return data.json();
}
throw new Error("Response not ok.");
})
.then((locationRequest) => generateHtml(locationRequest))
.catch((error) => console.error("Error:", error));
const generateHtml = (data) => {
console.log("data:")
console.log(data);
console.log("data.location.name:")
console.log(`${data.location.name}`);
const html = `
<div class="weather-location">
<h1>${data.location.name}, ${data.location.country}</h1></div>
<div class="details">
<span>Tmp: ${data.current.temp_c} °C</span>
<span>Feels like: ${data.current.feelslike_c} °C</span>
</div>
`;
const weatherDiv = document.querySelector(".weather");
weatherDiv.innerHTML = html;
};
/* SEARCH BAR */
const citiesList = document.getElementById('weather-cities');
const searchBar = document.getElementById('weather-searchbar');
let cities = [];
console.log("citiesList:");
console.log(citiesList);
console.log("searchBar:");
console.log(searchBar);
searchBar.addEventListener('keyup', (e) => {
userCity = e.target.value.toLowerCase();
console.log("usercity:");
console.log(userCity);
const filteredCities = cities.filter((city) => {
return (
city.name.toLowerCase().includes(userCity) ||
city.region.toLowerCase().includes(userCity) ||
city.country.toLowerCase().includes(userCity)
);
});
displayCities(filteredCities);
});
const loadCities = async () => {
try {
currentType = "search.json";
const res = await fetch(apiUrl);
cities = await res.json();
console.log("cities:");
console.log(cities);
displayCities(cities);
} catch (err) {
console.error(err);
}
};
const displayCities = (cities) => {
let htmlString = cities
.map((city) => {
return `
<li class="character">
<h2>${city.location.name}</h2>
<p>Temperature: ${city.current.temp_c} °C</p>
<p>Feels like:${city.current.feelslike_c} °C></p>
</li>
`;
})
.join('');
citiesList.innerHTML = htmlString;
};
loadCities();
<div class="other-stats">
<div class="weather-search">
<input type="text" id="weather-searchbar" placeholder="Your city"></input>
<ul id="weather-cities"></ul>
</div>
<div class="weather"></div>
</div>
<script src="../static/weather_api.js"></script>
【问题讨论】:
-
console.log(cities);记录什么?看起来它可能是一个对象而不是一个数组。 -
错误是说
cities不是一个数组。确保它不是undefined或null或看起来像数组但不是数组的东西(例如节点列表) -
@pilchard 它给了我API调用的所有信息,即JSON格式的API的天气数据
-
@slebetman 嗯,所以城市首先是一个空数组,所以可能就是这样,但我只在文件末尾调用函数 loadCities,并且当该函数运行时,根据控制台。日志,“城市”已经是我根据 API 获得的 JSON 文件 编辑:虽然 addEventlListener 在函数运行之前已经存在,这是一个问题吗?从技术上讲,只有当有“keyup”时才会发生某事
-
空数组应该可以工作。空数组不是产生错误的原因。 JSON 文件正在生成错误。我看不到哪个日志是
cities,但我在日志屏幕截图中看不到任何数组。我看到一个字符串“London”和几个Objects。我没有看到任何 Array
标签: javascript json api filter typeerror