JavaScript按关键词搜索国家对象数组返回匹配项问题求助
你代码里的核心错误
- 多余的
Object.keys调用:countries是数组,Object.keys(countries)拿到的是数组的索引字符串数组,和你要遍历国家数据的需求完全不相关 - 属性访问错误:
countries是存放所有国家的根数组,本身没有name属性,只有数组里的单个国家对象才有name字段 - 逻辑重复混乱:你同时用了
for循环和filter高阶函数,filter本身就会完成全数组遍历,不需要额外套循环,在循环里反复调用filter还会造成不必要的性能损耗 - 筛选条件错误:
filter回调里拿到的country是单个国家对象,不能直接调用字符串的includes方法,必须访问它的name属性再做匹配 - 笔误:第二个函数调用多写了前缀
s,写成scategorizeCountries会直接报未定义错误
正确实现(符合高阶函数使用要求)
你当前在学高阶函数,直接用filter实现就可以,不需要手写for循环:
const countries = [ // 你原有的国家数据保持不变 { name: 'Afghanistan', capital: 'Kabul', languages: ['Pashto', 'Uzbek', 'Turkmen'], population: 27657145, flag: 'https://restcountries.eu/data/afg.svg', currency: 'Afghan afghani' }, { name: 'Åland Islands', capital: 'Mariehamn', languages: ['Swedish'], population: 28875, flag: 'https://restcountries.eu/data/ala.svg', currency: 'Euro' } // ...其余国家数据 ] function categorizeCountries(keyword) { const result = countries.filter(country => { // 统一转小写实现不区分大小写匹配,避免大小写导致的匹配失败 return country.name.toLowerCase().includes(keyword.toLowerCase()) }) if (result.length === 0) { console.log('Country not found') } return result } // 测试调用 console.log(categorizeCountries('land')) // 会返回所有名称带land的国家,比如Åland Islands、Finland等 console.log(categorizeCountries('stan')) // 会返回所有名称带stan的国家,比如Afghanistan、Pakistan等
实现逻辑说明
Array.filter是JS内置的数组高阶方法,会自动遍历数组每一项,把所有满足回调判断条件(回调返回true)的元素收集起来,组成新数组返回- 匹配时统一将国家名、搜索关键词转为小写,不管用户输入的关键词是大写还是小写,都能正常匹配,容错性更好
- 函数最终直接返回匹配到的结果数组,符合题目要求的返回值规则
- 去掉了无意义的手动for循环和多余的keys获取逻辑,代码更简洁,也符合高阶函数章节的练习目标
内容的提问来源于stack exchange,提问作者ianh22
相关产品推荐
相关产品推荐

