Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何筛选嵌套数组中的字符串?_Javascript_Reactjs - Fatal编程技术网

Javascript 如何筛选嵌套数组中的字符串?

Javascript 如何筛选嵌套数组中的字符串?,javascript,reactjs,Javascript,Reactjs,我正在尝试实现一个搜索函数,返回指定数组中有搜索词的find。比如说,一个集合有[aa,ab,aaa],搜索词是“a”。在这种情况下,返回要显示的对象。因为数组中至少有一个字符串具有“a” 数据结构 [ { name:'aa', searchWords:['aa','ab','bc'] <- I want to use this array for search }, { name:'bb', searchWords:['bb','bc','de'] &

我正在尝试实现一个搜索函数,返回指定数组中有搜索词的find。比如说,一个集合有[aa,ab,aaa],搜索词是“a”。在这种情况下,返回要显示的对象。因为数组中至少有一个字符串具有“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
  },
...
]
此部件出现问题

} 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');
}

您不会从
过滤器
回调返回

作为旁注,还有
String#includes

filterStudents = students.filter(student =>
  student.tags.some((tag) => tag.includes(searchTag))
);

您不会从
过滤器
回调返回

作为旁注,还有
String#includes

filterStudents = students.filter(student =>
  student.tags.some((tag) => tag.includes(searchTag))
);

如果您只想在填写相应的
searchTag
searchName
时搜索匹配项,请使用
过滤器
回调中的条件运算符检查是否应执行过滤器测试:

const学生=[
{
姓名:'aa',
搜索词:['aa','ab','bc']
},
{
姓名:'bb',
搜索词:['bb','bc','de']
},
];
常量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(过滤);
};
window.addEventListener('change',doFilter)


如果您只想在填写相应的
searchTag
searchName
时搜索匹配项,请使用
过滤器
回调中的条件运算符检查是否应执行过滤器测试:

const学生=[
{
姓名:'aa',
搜索词:['aa','ab','bc']
},
{
姓名:'bb',
搜索词:['bb','bc','de']
},
];
常量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(过滤);
};
window.addEventListener('change',doFilter)


有一个
返回值
缺失。有一个
返回值
缺失。感谢您的评论。这是一条正确的道路。我有一个问题,我有四个条件,它们来自于名称和标记的真与假的组合。在这种情况下,我应该这样做吗?就像在中一样,除了检查搜索字符串是否有长度外,还需要检查两个字符串是否包含或否定?在这一点上,很难将其轻松地放入单个回调表达式中-最好先将两个测试放入变量中,然后根据其他标记有条件地返回变量或其否定项。例如:您已删除的注释,该注释已出现在答案中-
searchWords.some(word=>word.toLowerCase()。包括(searchTag))
其中
searchTag
已小写(请参阅
.map
回调)谢谢你的评论。这是一个正确的方法。我有一个问题,我有四个条件,它们来自名称和标记的真与假的组合。在这种情况下,我应该这样做吗?就像除了检查搜索字符串是否有长度外,你还需要检查两个字符串是否包含或否定?在在这一点上,它太多了,无法方便地放入单个回调表达式中-最好先将两个测试放入变量中,然后根据其他标记有条件地返回变量或其否定项。例如:您已删除的注释,该注释已出现在答案中-
searchWords.some(word=>word.toLowerCase()。包括(searchTag))
其中
searchTag
已经是小写(请参阅
.map
回调)感谢您的评论。我遵循了此代码的建议。但是它仍然不起作用。否则如果(searchName.length==0&&searchTag.length>0){filterStudents=students.filter((student)=>student.tags.some((tag)=>tag.includes(searchTag));抱歉。我刚刚找到了解决方案。添加.toLowerCase()使此serch生效。filterStudents=students.filter((student)=>student.tags.some((tag)=>tag.includes(searchTag.toLowerCase());谢谢您的评论。我按照此代码的建议进行了操作。但是它仍然不起作用。否则如果(searchName.length==0&&searchTag.length>0){filterStudents=students.filter((student)=>student.tags.some((tag)=>tag.includes(searchTag));对不起,我刚刚找到了解决方案。添加.toLowerCase()使这个serch有效。filterStudents=student.filter((student)=>student.tags.some((tag)=>tag)=>tag.includes(searchTag.toLowerCase()));