首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数组中搜索筛选数组项

如何在数组中搜索筛选数组项
EN

Stack Overflow用户
提问于 2022-01-16 07:05:33
回答 2查看 272关注 0票数 1

我的问题是,我想找到每一个标题电影的类别,我想搜索。例如

searchInput =行动 outputShown =变压器,恐龙,哥斯拉

因为我有如下所列的类别:

代码语言:javascript
复制
    const category = ['Comedy','Classic','Drama','Romance','Science- 
     Fiction','Adult','Sex','Kids','Animation','Cartoon','Action','Storyline','Tragic']

我希望这个TitleItems能够与我的搜索软件相匹配,即使它们有不同的类别。

代码语言:javascript
复制
    const TitleItems =  {
            imgPath:'', name:'The Office',type:['Comedy','Classic','Romance'],views:"5666",rate:"4.1"
        },
        {
            imgPath:'', name:'Ready Player One',type:['Science-Fiction','Romance','Drama'],views:"7776",rate:"4.2"
        },
        {
            imgPath:'', name:'Interstellar',type:['Science-Fiction','Drama','Romance','Tragic'],views:"10505",rate:"4.5"
        },
        {
            imgPath:'', name:'Transformer',type:['Science-Fiction','Action','Classic','Comedy'],views:"20015",rate:"4.3"
        },
        {
            imgPath:'', name:'Jack N The Giant',type:['Science-Fiction','Action','Adult','Comedy'],views:"12234",rate:"4.2"
        }

正如您所看到的,这里唯一的问题是item.type,因为它有一个数组--我不能作为item.type.toLowerCase().includes(search.toLowerCase())来执行它,但是我可以作为item.type[0].toLowerCase().includes(search.toLowerCase())来完成它,因为它不能包含一个数组,但是我真正想要做的是在标题的每个项目类型的数组中搜索。所以我想知道那是怎么回事?有人知道吗?我不知道我问得对不对。如果这是个糟糕的问题,请帮我编辑一下。

代码语言:javascript
复制
    const [search,setsearch] = useState("");

    const ListItems = items.filter((item,index) => {
        return (
            item.name.toLowerCase().includes(search.toLowerCase()) ||
            item.views.toLowerCase().includes(search.toLowerCase()) ||
            item.rate.toLowerCase().includes(search.toLowerCase()) || 
            item.type.toLowerCase().includes(search.toLowerCase())
        )   
    }).map((item,index) => {
        return(
            <div>
                <h1 key={index}> 
                    {item.name}, {item.type} {item.views} {item.rate} 
                </h1>

            </div>

        )
    })

这是显示输出的主体

代码语言:javascript
复制
    <input type="text" name='search' placeholder='Search...' value={search} onChange={e => setsearch(e.target.value)} />
     {ListItems}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-16 07:10:38

您可以使用Array.prototype.some扩展该条件( some()方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试)。

代码语言:javascript
复制
item.type.some(category => category.toLowerCase().includes(search.toLowerCase()))

在筛选条件下,按以下方式更新

代码语言:javascript
复制
const [search,setsearch] = useState("");

const ListItems = items.filter((item,index) => {
    return (
        item.name.toLowerCase().includes(search.toLowerCase()) ||
        item.views.toLowerCase().includes(search.toLowerCase()) ||
        item.rate.toLowerCase().includes(search.toLowerCase()) || 
        item.type.some(category => category.toLowerCase().includes(search.toLowerCase()))
    )   
}).map((item,index) => {
    return(
        <div>
            <h1 key={index}> 
                {item.name}, {item.type} {item.views} {item.rate} 
            </h1>

        </div>

    )
})
票数 2
EN

Stack Overflow用户

发布于 2022-01-16 07:18:12

您需要循环遍历列表,并在该列表中添加包含该筛选器文本的任何类别。

您将使用两个数组方法,forEachsome

对你的问题的简单解释:

代码语言:javascript
复制
// example from your scenario
const TitleItems: { id: number, list: string[] }[] = [
    {
        id: 12,
        list: ['1', '2', '3', '4', '5', '6', '7', '8']
    }
]

// the accumulator function that shall be taking in the values that have passed our given test
let accumulator: any[] = []

// first loop through all the items by forEach
TitleItems.forEach((item) => {

// then use a comparison using some, some will return true when any element in it matches the query you put
// the query should be your search string
if (item.list.some(item => item === '12')) {
    accumulator.push(item)
}
})

最后,累加器数组将具有传递该条件的值.

对于一个我不推荐给初学者的非常高级的解决方案,就是使用数组减少函数来解决这种情况。

阅读更多关于某些方法这里的信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70728026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档