[英]how to filter strings in nested array?
我正在嘗試實現一個搜索 function ,它返回在指定數組中有搜索詞的 find 。 假設一個集合有[aa,ab,aaa],搜索詞是“a”。 在這種情況下,返回 object 以顯示。 因為數組中至少有一個字符串有'a'。
數據結構
[
{
name:'aa',
searchWords:['aa','ab','bc'] <- I want to use this array for search
},
{
name:'bb',
searchWords:['bb','bc','de'] <- I want to use this array for search
},
...
]
我試圖通過使用includes()、filter()、indexOf()來解決這個問題。 但是,當搜索詞完全匹配時,它仍然不返回任何內容或返回數據。 如何修復代碼以實現瞄准? 先感謝您!
這部分效果很好
let filterStudents = students;
if (searchName.length > 0 && searchTag.length === 0) {
filterStudents = students.filter((student) => {
if (
student.firstName.toLowerCase().includes(searchName.toLowerCase())
|| student.lastName.toLowerCase().includes(searchName.toLowerCase())
) {
return true;
}
return false;
});
這部分出現問題
} else if (searchName.length === 0 && searchTag.length > 0) {
filterStudents = students.filter(
(student) => {
console.log(student.tags);
student.tags.filter((tag) => {
console.log(tag);
tag.indexOf(searchTag) > -1;
});
},
);
} else if (searchName.length > 0 && searchTag.length > 0) {
} else {
console.log('both');
}
您不會從filter
回調中return
作為旁注,還有String#includes
:
filterStudents = students.filter(student =>
student.tags.some((tag) => tag.includes(searchTag))
);
如果只想在對應的searchTag
或searchName
填寫完成后搜索匹配,使用filter
回調中的條件運算符來檢查是否應該進行過濾器測試:
const students = [ { name:'aa', searchWords:['aa','ab','bc'] }, { name:'bb', searchWords:['bb','bc','de'] }, ]; const doFilter = () => { const [searchName, searchTag] = [...document.querySelectorAll('input')].map(input => input.value.toLowerCase()); const filtered = students.filter(({ name, searchWords }) => ( (searchName? name.toLowerCase().includes(searchName): true) && (searchTag? searchWords.some(word => word.toLowerCase().includes(searchTag)): true) )); code.textContent = JSON.stringify(filtered); }; window.addEventListener('change', doFilter);
<input placeholder="searchName"> <input placeholder="searchTag"> <div> <code id="code"></code> </div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.