当前位置: 首页 > 知识库问答 >
问题:

当被筛选的数组包含JSON数据时,为什么会得到未定义的“无法读取属性”filter?

陆昂然
2023-03-14

以下代码

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:无法读取未定义的'filter'属性'

我可以使用控制台记录数据。日志(大学)。那为什么我不能过滤掉呢?仅供参考数据是一个对象数组。非常感谢您的帮助。非常感谢。

共有2个答案

岑叶秋
2023-03-14

我只是想让每个人都知道我终于成功了。我必须安装babel polyfill和babel preset env,并将其添加到网页包中,以使UglifyJS与async await一起工作,并优化捆绑包的大小。

出于某种原因,我不得不使用async await而不是常规的promise来将HTML呈现到DOM中,不知道为什么。无论如何,以下是最终按预期工作的代码:

UniFetch.js

const endpoint = 'https://raw.githubusercontent.com/Hipo/university-domains-list/master/world_universities_and_domains.json';

const universities = [];

const promise = fetch(endpoint)
    .then(blob => blob.json())
    .then(data => universities.push(...data.slice(8286, 8456)));

function findMatches(wordToMatch) {
    return promise.then(() => universities.filter(uni => {
        const regex = new RegExp(wordToMatch, 'gi');
        return uni.name.match(regex)
    }));
}

async function displayMatches() {
    searchResults.innerHTML = await findMatches(this.value)
        .then(arr => arr.map(uni => {
        return `
            <li>${uni.name}</li>
        `
    }));
}

const searchInput = document.querySelector("input[name='unisearch']");
const searchResults = document.querySelector('.unisearch__results');

searchInput.addEventListener('change', displayMatches);
searchInput.addEventListener('keyup', displayMatches);

export default findMatches

应用程序。js

import FindMatches from '../UniFetch.js'

FindMatches()

希望这能帮助一些人实现一个typeahead、自动完成API获取。

蔡理
2023-03-14

您需要删除大学作为findMatches函数中的参数,因为它覆盖了本地大学变量的值:

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应返回如下promise:

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));
 类似资料:
  • 问题内容: 我知道这是一个很普遍的问题,我在Stack Overflow和其他网站(包括datatables网站)上阅读了所有类似的问题。 为了澄清,我正在使用 PHP Codeigniter 物质学 我还确保我正确接收了JSON数组: 我的HTML表格如下所示: 这是我的功能: 我得到的错误是 未捕获的TypeError:无法读取未定义的属性’length’ 问题答案: 原因 此错误通常意味着j

  • 问题内容: Angular.js v1.0.6 进行$ http.post并收到非200的请求时(本例为401) Angular引发以下错误: 而且永远不要调用回调或errback使得无法处理响应。 难道我做错了什么?成功回叫将在提供合法凭据时按预期方式被调用。 200回应: 401回应: 此外,如果我采用普通的Promise语法来支持.success()快捷方式,则会得到一些有趣的行为: 问题答

  • 我在拼接阵列时遇到了问题。我试图拼接它来修改数组中元素的位置,但它返回时出现错误。 其中旧列表为: 和新列表:

  • 问题内容: 我正在尝试使用移动应用程序做一个简单的hello world firebase函数,我想记录用户ID,以便可以看到该函数确实起作用。这是我当前的JavaScript代码: 当新数据写入特定的数据库表时,它会触发,但是会出现此错误: 通知数据库如下所示: 问题答案: 您需要安装最新的firebase-functions和firebase-admin: 为了能够使用新的API,请在此处查看

  • 我是Firebase函数的新手,在官方文档中看到了一些变化,但是当我在做一个通知系统时,当我试图获取我的令牌id时,它抛出了这个错误。 我的代码 错误 无法在导出处读取未定义的属性“val”.js user_code。(/user_code/node_modules/火库函数/库/云函数.js:112:27) 在下一个 (本机) 在 /user_code/node_modules/火基函数/库/云

  • 为什么我得到这个错误不能读取未定义的触摸属性? 为什么它不能读取,但它可以读取 当我们使用