Javascript React/JS过滤器出现故障
我试图实现一个过滤器函数,当用户在搜索栏中键入内容时,它能够在两个单独的JSON字段中进行搜索。搜索整个JSON会返回错误,如果我重复这个函数,两个相似的函数会相互抵消 我当前的筛选功能:Javascript React/JS过滤器出现故障,javascript,json,reactjs,filtering,Javascript,Json,Reactjs,Filtering,我试图实现一个过滤器函数,当用户在搜索栏中键入内容时,它能够在两个单独的JSON字段中进行搜索。搜索整个JSON会返回错误,如果我重复这个函数,两个相似的函数会相互抵消 我当前的筛选功能: let filteredOArt = origArt.filter((origAItem) => { return origAItem.authors.toLowerCase().includes(this.state.search.toLowerCase())
let filteredOArt = origArt.filter((origAItem) => {
return origAItem.authors.toLowerCase().includes(this.state.search.toLowerCase())
});
我希望能够在“作者”字段以及“描述”字段中进行搜索
在React渲染之前,我让此函数监听状态:
updateSearch(event) {
this.setState({ search: event.target.value })
}
然后,我的搜索功能位于React返回中的输入字段中:
<h6>Search by author name: <input type="text" value={this.state.search} onChange={this.updateSearch.bind(this)} /></h6>
按作者姓名搜索:
您可以像这样调整函数
let filteredOArt = origArt.filter((origAItem) => {
return (
(origAItem.authors.toLowerCase().includes(this.state.search.toLowerCase())||
(origAItem.description.toLowerCase().includes(this.state.search.toLowerCase())
)
)
});
实际上,您可以对这两个字段进行筛选 如果您有searchValue和包含对象的数组,则可以通过以下方式进行筛选:
const filterByAuthorOrDescription = (searchValue, array) =>
array.filter(
item =>
item.authors.toLowerCase().includes(searchValue.toLowerCase()) ||
item.description.toLowerCase().includes(searchValue.toLowerCase())
);
filtered
现在将包含一个对象数组,其中包含您可以映射到的描述或作者中的搜索值。您可以使用它来检查至少一个字段的筛选器是否为正值:
let filteredOArt = origArt.filter(origAItem => ['authors', 'description'].some(field => origAItem.[field].toLowerCase().includes(this.state.search.toLowerCase())))
只需迭代您想要使用的不同字段名
Some
将返回true
,如果提及的任何字段包含您的字符串,并避免在代码中重复
长语法:
origArt.filter(origAItem => {
return ['authors', 'description'].some(field => origAItem.[field].toLowerCase().includes(this.state.search.toLowerCase()))
})
您可以分享您的
origArt
内容吗?如果我们看不到数据的结构,那么很难说过滤器是否起作用。它是这样设置的:“文章”:[{“作者”:“Iaizzo PA,Pozos RS:,“描述”:“运动引起的踝关节生理活动震颤振幅改变”。,“出版商”:《应用生理学杂志》53:1164-1170,,“日期”:“1982,,“journalID”:“PMID:7174409”},希望这能有所帮助!谢谢,它工作得很好,代码也很容易阅读!
origArt.filter(origAItem => {
return ['authors', 'description'].some(field => origAItem.[field].toLowerCase().includes(this.state.search.toLowerCase()))
})