javascript - Uncaught (in promise) TypeError: states.filter is not a function at searchStates
问题描述
[
{
"abbr": "AL",
"name": "Alabama",
"web": "www.google.com",
"capital": "Montgomery",
"lat": "32.361538",
"long": "-86.279118"
},
{
"abbr": "AK",
"name": "Alaska",
"capital": "Juneau",
"lat": "58.301935",
"long": "-134.419740"
},
{
"abbr": "AZ",
"name": "Arizona",
"capital": "Phoenix",
"lat": "33.448457",
"long": "-112.073844"
},
{
"abbr": "AR",
"name": "Arkansas",
"capital": "Little Rock",
"lat": "34.736009",
"long": "-92.331122"
},
{
"abbr": "CA",
"name": "California",
"capital": "Sacramento",
"lat": "38.555605",
"long": "-121.468926"
},
{
"abbr": "CO",
"name": "Colorado",
"capital": "Denver",
"lat": "39.7391667",
"long": "-104.984167"
},
{
"abbr": "CT",
"name": "Connecticut",
"capital": "Hartford",
"lat": "41.767",
"long": "-72.677"
},
{
"abbr": "DE",
"name": "Delaware",
"capital": "Dover",
"lat": "39.161921",
"long": "-75.526755"
},
{
"abbr": "FL",
"name": "Florida",
"capital": "Tallahassee",
"lat": "30.4518",
"long": "-84.27277"
},
{
"abbr": "GA",
"name": "Georgia",
"capital": "Atlanta",
"lat": "33.76",
"long": "-84.39"
},
{
"abbr": "HI",
"name": "Hawaii",
"capital": "Honolulu",
"lat": "21.30895",
"long": "-157.826182"
},
{
"abbr": "ID",
"name": "Idaho",
"capital": "Boise",
"lat": "43.613739",
"long": "-116.237651"
},
{
"abbr": "IL",
"name": "Illinois",
"capital": "Springfield",
"lat": "39.783250",
"long": "-89.650373"
},
{
"abbr": "IN",
"name": "Indiana",
"capital": "Indianapolis",
"lat": "39.790942",
"long": "-86.147685"
},
{
"abbr": "IA",
"name": "Iowa",
"capital": "Des Moines",
"lat": "41.590939",
"long": "-93.620866"
},
{
"abbr": "KS",
"name": "Kansas",
"capital": "Topeka",
"lat": "39.04",
"long": "-95.69"
},
{
"abbr": "KY",
"name": "Kentucky",
"capital": "Frankfort",
"lat": "38.197274",
"long": "-84.86311"
},
{
"abbr": "LA",
"name": "Louisiana",
"capital": "Baton Rouge",
"lat": "30.45809",
"long": "-91.140229"
}
]
我有以下代码,当我从本地存储中获取数据(我在上面的本地存储库中导出 .json 文件)时,正如您在下面代码的注释部分中看到的那样,它可以正常工作。当我尝试从外部 url 获取数据时,出现“TypeError:states.filter 不是 searchStates 的函数”错误。如何从外部 url 获取我的数据?(从外部 url,我可以读取 .json 文件,并且可以使用“console.log”查看其内容,但在尝试过滤时出现此错误)
const search = document.getElementById('search');
const matchList = document.getElementById('match-list');
const searchStates = async searchText =>{
let url = 'https://v1.nocodeapi.com/emrescksn/webflow/WAOOrnxdScaWCRlT';
let res= await fetch(url);
//let res= await fetch('../json/states.json');
let states= await res.json();
let matches=states.filter(state => {
const regex = new RegExp(`^${searchText}`,`gi`);
return state.name.match(regex) || state.abbr.match(regex);
});
if(searchText.length === 0){
matches=[];
matchList.innerHTML='';
}
outputHtml(matches);
};
const outputHtml = matches => {
if(matches.length > 0) {
const html=matches.map(match => `
<div class="card card-body mb-1">
<h4>${match.name} (${match.abbr}) <a href="https://${match.web}/">Visit W3Schools.com!</a></h4>
</div>
`).join('');
matchList.innerHTML = html;
}
}
search.addEventListener('input', () => searchStates(search.value));
解决方案
您问题的预期 JSON 结果与 API 中的 JSON 不同!
您可以使用states.items.filter
代替,states.filter
但链接的 API 没有属性abbr
,因此它将返回undefined:
const search = document.getElementById('search');
const matchList = document.getElementById('match-list');
const searchStates = async searchText => {
let url = 'https://v1.nocodeapi.com/emrescksn/webflow/WAOOrnxdScaWCRlT';
let res = await fetch(url);
//let res= await fetch('../json/states.json');
let states = await res.json();
let matches = states.items.filter(state => {
const regex = new RegExp(`^${searchText}`, `gi`);
return state.name.match(regex);
});
if (searchText.length === 0) {
matches = [];
matchList.innerHTML = '';
}
outputHtml(matches);
};
const outputHtml = matches => {
if (matches.length > 0) {
const html = matches.map(match => `
<div class="card card-body mb-1">
<h4>${match.name} (${match.abbr}) <a href="https://${match.web}/">Visit W3Schools.com!</a></h4>
</div>
`).join('');
matchList.innerHTML = html;
}
}
search.addEventListener('input', () => searchStates(search.value));
<input type="text" id="search">
<div id="match-list"></div>
推荐阅读
- python - 使用 for 循环查找列表中具有相同值的元素之间的元素
- python - Pandas DataFrame 中的年初至今返回
- laravel - 在 Laravel 上使用 Sail 时没有匹配的清单错误
- php - 如何将html表单的总、平均和等级放入mysql数据库
- asp.net - 登录功能在我的 mvc 5 应用程序中工作,但经过一些操作后它会自动注销
- sql-server - Sql查询以获取匹配和不匹配记录的计数
- python - 尽管有 conda 3.6 环境,但 Python 版本 2.7
- r - 连续小波变换 - 日期未以正确格式显示
- flutter - 从 3.0.1 => 4.0.1 升级后颤振斩波器构建失败,请帮助了解生成器输出
- visual-studio-code - 如何在 vscode 中禁用受限模式功能和/或横幅