以下代码
const endpoint = 'https://raw.githubusercontent.com/Hipo/university-domains-list/master/world_universities_and_domains.json';
const universities = [];
fetch(endpoint)
.then(results => results.json())
.then(data => universities.push(...data));
console.log(universities);
function findMatches(wordToMatch, universities) {
return universities.filter(uni => {
const regex = new RegExp(wordToMatch, 'gi');
return uni.name.match(regex)
})
}
export default findMatches;
返回下面的错误
“未捕获的TypeError:无法读取未定义的属性”过滤器”
我可以使用console.log(universities)记录数据。那我为什么不能过滤呢?仅供参考,数据是对象数组。任何帮助都受到赞赏。谢谢。
最佳答案
您需要在universities
函数中删除findMatches
作为参数,因为它会覆盖局部universities
变量的值:
function findMatches(wordToMatch) {
return universities.filter(uni => {
const regex = new RegExp(wordToMatch, 'gi');
return uni.name.match(regex)
})
}
然后可以继续使用
findMatches
函数,如下所示:findMatches("hi") // returns a filtered array
编辑:
您的代码中存在竞争条件,其中
findMatches
可能会被调用fetch
完成之前。要解决此问题,findMatches
应该返回如下承诺:const endpoint = 'https://raw.githubusercontent.com/Hipo/university-domains-list/master/world_universities_and_domains.json';
const universities = [];
const promise = fetch(endpoint)
.then(results => results.json())
.then(data => universities.push(...data));
console.log(universities);
function findMatches(wordToMatch) {
return promise.then(() => universities.filter(uni => {
const regex = new RegExp(wordToMatch, 'gi');
return uni.name.match(regex)
}));
}
findMatches("hi").then(arr => console.log(arr));
如果您完全确定在
findMatches
完成后始终会调用fetch
,则可以采用第一个解决方案。否则,强烈建议您使用第二个使用Promise的解决方案。