[英]how to filter strings in array?
我试图搜索 function。 这个 function 检查嵌套数组,它有多个字符串,如果数组有搜索词则返回。
数组的数据结构
[
{
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
},
...
]
我尝试使用 indexOf function。
但是,我无法使用下面的代码显示任何组件。
但是我在代码中将目标值从item.searchWords更改为item.name 。 有效。
HTML
<div className="itemWrapper">
{filterItems.map((item, idx) => (
<Item key={idx} {...item} id={idx} list={list} />
))}
</div>
Js
const filterItems = list.filter(
(item) => item.searchWords.indexOf(searchWord) !== -1,
);
我想要的结果是搜索结果实时更新。
例如上面相同的数据结构,当用户搜索'a'时,searchWords 'aa'和'ab'返回true以显示项目,
非常感谢你的帮助。
您需要遍历 searchWords 数组以查找它是否与搜索词匹配。 这个会起作用const filterItems = list.filter( (item) => item.searchWords.filter((myWord) => myWord.indexOf(searchWord)>-1) );
您可以尝试在 object 的 name 属性上使用find()
和includes()
,最后使用filter()
。
演示:
var list = [ { name:'aa', searchWords:['aa','ab','bc'] }, { name:'bb', searchWords:['bb','bc','de'] } ] document.getElementById('searchWord').addEventListener('input', function(){ console.clear(); var filterItems = list.find(item => item.name.includes(this.value)); filterItems = filterItems? filterItems.searchWords: []; filterItems = filterItems.filter(i => i.includes(this.value)); console.log(filterItems); });
<input id="searchWord"/>
您可以使用array#reduce
并通过检查搜索词使用array#filter
过滤searchWords
数组。
const dataSource = [{ name: 'aa', searchWords: ['aa', 'ab', 'bc'] }, { name: 'bb', searchWords: ['bb', 'bc', 'de'] } ], searchWord = 'a', result = dataSource.reduce((res, {name, searchWords}) => { let matched = searchWords.filter(word => word.includes(searchWord)); if(matched.length) { res.push({name, searchWords: matched}); } return res; },[]) console.log(result);
这是因为indexOf
如何使用array
和strings
工作。
假设 indexOf 的语法是
operatedItem.indexOf(searchedItem);
在这里,在你的情况下
{
name:'bb',
searchWords:['bb','bc','de']
}
名称是一个字符串,
并且searchWords 是一个数组。
当你执行:
name.indexOf("b"); //0
name.indexOf("bb"); //0
name.indexOf("a"); //-1
它将检查searchedItem
是否存在于operatedItem
中的任何位置。
let str = "aa ab a bb"; console.log(str.indexOf("a")); //0 console.log(str.indexOf("aa")); //0 console.log(str.indexOf("ab")); //3 console.log(str.indexOf("b")); //4 console.log(str.indexOf("c")); //-1 console.log(str.indexOf("aaa")); //-1
当indexOf 与 array 一起使用时,
它检查operatedItem
项数组中是否存在searchedItem
,它不会 go 用于 substring 搜索。
let arr = ["aa", "ab", "a", "bb"]; console.log(arr.indexOf("a")); //2 console.log(arr.indexOf("aa")); //0 console.log(arr.indexOf("ab")); //1 console.log(arr.indexOf("b")); //-1 console.log(arr.indexOf("c")); //-1 console.log(arr.indexOf("aaa")); //-1
代码的问题在于,当您使用 indexOf 时,它会尝试查找数组是否包含单词。 例如:当您搜索“a”时,代码会检查数组中是否有任何单词“a”,而不是任何包含字母“a”的单词。
您需要将 JS 部分更改为:
JS
const list = [{ name: 'aa', searchWords: ['aa', 'ab', 'bc'] }, { name: 'bb', searchWords: ['bb', 'bc', 'de'] } ]; let searchWord = "a"; const filterItems = list.filter( (item) => item.searchWords.filter(word => word.includes(searchWord)).length > 0 ); document.getElementById('result').innerHTML = JSON.stringify(filterItems);
<p id="result"> </>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.