#javascript #reactjs
Вопрос:
Новичок здесь, я пытаюсь создать фильтр поиска, и я не уверен, почему я получаю эту ошибку:
Ошибка типа: Не удается прочитать свойство «В нижнем регистре» неопределенного
Проблема выглядит так, как будто это тип данных, которые вводятся в нижнем регистре, но я точно не знаю, как это исправить.
Я перепробовал все в ответе ниже
let mangas = [
{
id: '4',
name: 'Some Manga',
author: 'Some Name',
artist: 'Some Name',
chapters: 'Some Number',
},
function Search() {
const [search, setSearch] = useState('');
return (
<div>
<Navbar1 />
<NavbarExplore />
<section className="bg-light" style={{ minHeight: 700 }}>
<div className="container">
<div className="column pb-5 mb-5" style={{ minHeight: 800 }}>
<h1
className="top-header pt-5 mb-5"
style={{ borderBottom: '1px black solid', width: 400 }}
>
Full List
</h1>{' '}
<div className="nav-item px-2 mr-4 mb-4">
<form className="form-inline" action="/action_page.php">
<input
type="search"
placeholder="Search.."
className="mr-sm-2 pl-3 my-2 ml-3 search3"
onChange={(e) => {
setSearch(e.target.value);
}}
/>
</form>
</div>
<div className="row" style={{ listStyleType: 'none' }}>
{Object.keys(mangas)
.filter((val) => {
if (search === '') {
return val;
} else if (
val.name.toLowerCase().includes(search.toLowerCase())
) {
return val;
} else {
return 'null';
}
})
.map((key) => (
<li key={key}>
<div className="card m-2 mb-3 p-2 listbox">
<div className="column">
<div className="col-sm mb-2" style={{ color: 'black' }}>
<h3>{mangas[key].name}</h3>
Комментарии:
1. По крайней мере, один из
search
них илиval.name
естьundefined
. Вам нужно отладить, какой именно, и выяснить, почему.2. Подождите, у вас есть
Object.keys(mangas) filter((val) => { /* ... */})
, это означаетval
, что может быть только строка. Ты это имел в видуObject.values(mangas)
? Или, можетmangas[key].name.toLowerCase().includes(search.toLowerCase())
быть ?3. Object.values не работает, потому что я ищу значение внутри ключа, я также пробовал mangas[ключ].name раньше, это устраняло ошибку, но в результате функция сортировки не работала. Я ценю ваши попытки!
4. Если вам нужны только значения массива, то
mangas.filter()
? Я действительно не уверен, что здесь должно происходить.5. Я хочу, чтобы это был фильтр поиска, пользователь вводит слова/буквы и отфильтровывает все, что не входит в то, что вводит пользователь. Входные данные должны принимать атрибут » имя » из массива, чтобы найти его. Также вы правы, val.name вероятно, в этом и есть проблема, просто не знаю, как ее исправить. То, что я пробовал, это mangas.keys.name, манги[ключи].имя, mangas.name, val.keys.name, и т. д
Ответ №1:
попробуйте использовать
Object.values(mangas).filter((val) => {
if (search === '') {
return val;
} else if (
val?.name.toLowerCase().includes(search.toLowerCase())
) {
return val;
} else {
return 'null';
}
});
Комментарии:
1. Попробуйте использовать Object.values вместо Object.keys
2. Он не может найти атрибут «имя»
3. Он вернет объект
4. Даже вам не нужно использовать Object.keys и Object.values одновременно . Вы можете просто написать mangas.filter .
5. Я немного сбит с толку, не могли бы вы объяснить немного подробнее