【问题标题】:Why can't I use filter for nested objects in javascript?为什么我不能在 javascript 中对嵌套对象使用过滤器?
【发布时间】:2020-07-16 07:27:08
【问题描述】:

我正在准备一个天气应用程序,它会在我们输入城市名称时提供建议列表。

Json 文件格式如下:

{"coord":{"lon":-0.13,"lat":51.51},
 "weather":[{"id":300,"main":"Drizzle","description":"light intensity drizzle","icon":"09d"}],
  "base":"stations",
  "main":{"temp":280.32,"pressure":1012,"humidity":81,"temp_min":279.15,"temp_max":281.15},
"visibility":10000,
"wind":{"speed":4.1,"deg":80},
"clouds":{"all":90},"dt":1485789600,
"sys":{"type":1,"id":5091,"message":0.0103,
"country":"GB",
"sunrise":1485762037,
"sunset":1485794875},
"id":2643743,
"name":"London",
"cod":200}

所以我对该功能的代码是:

inputcity.addEventListener("input",()=>getweather(inputcity.value));
const getweather=async searchtext=>{
    const res=await fetch("https://api.openweathermap.org/data/2.5/weather?q="+inputcity.value+"&units=metric&appid=78a661b7c335021c7d85065aea3673be");
    const cities= await res.json();
    
   
let matches=cities.filter(city=>{
     const regex=new RegExp(`^${searchtext}`,'gi');
        return city.name.match(regex);
});
console.log(matches);
};

我想要的是显示以相同字母开头的城市名称列表。

但它显示错误以下错误:

 *Uncaught (in promise)TypeError: cities.filter is not a function*

因为这个 api 在嵌套对象而不是在对象数组中提供数据。

如何使用过滤器或任何方法让我的代码正常工作?

【问题讨论】:

  • 不是cities.filter(....) 而不是data吗?你是从 API 中得到一个数组还是一个对象?
  • @Stutje 是的,是城市。抱歉,我附上了一个 api 数据样本,它位于嵌套对象中
  • 不是数组,反正只有一个城市!

标签: javascript json object filter


【解决方案1】:

因为我没有 50 声望在评论部分发表评论。
我将把我的 cmets 留在这里,以便您了解如何操作。

您从 https://api.openweathermap.org/data/2.5/weather?q="+inputcity.value+"&units=metric&appid=78a661b7c335021c7d85065aea3673be 获取 API 的代码仅返回 1 个城市的数据。

返回的数据也不是 ARRAY,而是 JSON 对象。 请参阅此处以更好地查看您的数据:https://codebeautify.org/jsonviewer/cb13b4bd

对于您在用户输入数据时关于城市名称的建议列表的想法,不在他们的 api 的功能上。

您应该为城市名称查找创建一个数组,并使用.startsWith(user.input) 显示建议。

示例超级低效的代码:

const userinput = "a";
var city = ["aaa", "abc", "bca", "cba", , "ccc"];
city.forEach(searchsuggestion);

function searchsuggestion(value, index) {
   if (value.startsWith(userinput)) {
      console.log("Suggestion : " + value);
   }
   else {
      return;
   }
}

上述代码的控制台输出应该是:

Suggestion : aaa
Suggestion : abc

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多