Javascript 如何使用2个输入字段过滤2个数组?

Javascript 如何使用2个输入字段过滤2个数组?,javascript,arrays,reactjs,map-function,Javascript,Arrays,Reactjs,Map Function,我想使用2个输入字段根据名称和标记过滤数据。它的名字很好过滤,但是我怎么能通过tags.tagList过滤呢?我正在努力,但没有得到任何解决方案。我想显示数据如果有人按姓名搜索,那么他们可以显示数据。此外,他们还可以按标签搜索数据,但标签列表位于另一个数组中。如何解决这个问题 const Home = () => { const [students, setStudents] = useState([]); const [tags, setTags] = useState([{ i

我想使用2个输入字段根据名称和标记过滤数据。它的名字很好过滤,但是我怎么能通过tags.tagList过滤呢?我正在努力,但没有得到任何解决方案。我想显示数据如果有人按姓名搜索,那么他们可以显示数据。此外,他们还可以按标签搜索数据,但标签列表位于另一个数组中。如何解决这个问题

const Home = () => {
  const [students, setStudents] = useState([]);
  const [tags, setTags] = useState([{ idNumber: "", tagList: "" }]);
  const [searchByName, setSearchByName] = useState("");
  const [searchByTag, setSearchByTag] = useState("");

  useEffect(() => {
    const url = ".../students";
    fetch(url)
      .then((data) => data.json())
      .then((data) => setStudents(data.students));
  }, []);

  const addTags = (id, tag, keyCode) => {
    if (keyCode == 13) {
      const newTag = [...tags, { idNumber: id, tagList: tag }];
      setTags(newTag);
      `document.getElementById(`tags${id}`).value = "";`
    }
  };
返回(
setSearchByName(e.target.value)}
/>
setSearchByTag(e.target.value)}
/>
{students.map((student)=>{
if(searchByName.length!==0){
如果(
`${student.firstName}${student.lastName}`
.tolocalLowercase()
.startsWith(searchByName.ToLocalLowerCase())
) {
返回(
);
}否则{
返回null;
}
}
返回(
);
})}
);
};
导出默认主页;

您希望为
标记创建一个类似地图的对象,以便在进行如下过滤时轻松查找特定用户的
标记列表

{ 
  id1: {id: id1, tagsList: [...]},
  id2: {id: id2, tagsList: [...]},
  id3: {id: id3, tagsList: [...]},
}
下面是一个示例解决方案,可以提供帮助
tagsMap
是上述查找对象

const学生=[
{id:1,姓:“AB”,姓:“CD”},
{id:2,姓:“CD”,姓:“EF”},
{id:3,名字:“EF”,姓氏:“GH”},
];
常量标记列表=[
{idNumber:1,标记列表:[“TA”、“TB”、“TC”]},
{idNumber:2,标记列表:[“TC”,“TD”]},
{idNumber:3,标记列表:[“TD”,“TE”]},
];
const searchByName=“C”;
const searchByTag=“TD”;
const tagsMap=tagsList.reduce((acc,tag)=>{
acc[tag.idNumber]=标签;
返回acc;
}, {});
const studentNameMatches=(学生,搜索术语)=>
`${student.firstName}${student.lastName}`
.tolocalLowercase()
.startsWith(searchTerm.toLocaleLowerCase());
常量studentHasTag=(学生,标记名)=>
tagsMap[student.id]?.tagsList.includes(标记名);
const filteredStudents=students.filter(
(学生)=>
studentNameMatches(student,searchByName)&&
studentHasTag(student,searchByTag)
);
//学生姓名以“C”开头,标签为“TD”

console.log(filteredStudents)每个学生都有标签列表吗?i、 e
idNumber
=
student.id
?没有学生没有任何标签。标记位于另一个数组中。您希望如何使用标记筛选学生?标记数组中的
idNumber
属性是否与添加标记的
student.id
相同?否,我想显示基于输入字段中键入的内容的数据。将有两个输入字段,一个用于按名称搜索,另一个用于按标记名称搜索。从一个数组中添加标记名。在标记数组中有2个属性,一个idNumber,另一个标记列表。在学生数组中有名为id、fristName、lastName等属性。但是标签是根据学生id添加的。好吧,我写了一个。如果您需要更多帮助,请对答案进行评论。谢谢您的帮助。但是这个代码对我的情况不合适。
{ 
  id1: {id: id1, tagsList: [...]},
  id2: {id: id2, tagsList: [...]},
  id3: {id: id3, tagsList: [...]},
}