React项目中通过两个数组比较实现多标签筛选model的方法
问题核心原因
JavaScript中两个数组使用==比较时,对比的是数组的内存引用地址,而非内部的元素内容,哪怕两个数组的元素完全一致,直接用==判断也会返回false。同时你之前单标签筛选的写法本身存在隐式类型转换的隐患,仅在model只有一个标签时能碰巧生效。
需求1:匹配任意一个选中标签即可(最常用的筛选逻辑)
只要model包含activeTags中的任意一个标签,就会被筛选出来,代码如下:
this.state.models.filter(item => { // 提取当前model关联的所有标签ID const modelTagIds = item.user_tags.map(tag => tag.id); // 判断选中标签中至少有一个存在于当前model的标签ID列表中 return this.state.activeTags.some(activeTagId => modelTagIds.includes(activeTagId)); }).map(/* 原有渲染逻辑 */)
需求2:必须同时匹配所有选中标签
model需要包含activeTags里的全部标签才会被筛选出来,代码如下:
this.state.models.filter(item => { const modelTagIds = item.user_tags.map(tag => tag.id); // 判断所有选中的标签ID,都存在于当前model的标签ID列表中 return this.state.activeTags.every(activeTagId => modelTagIds.includes(activeTagId)); }).map(/* 原有渲染逻辑 */)
补充说明
- 如果你实际存储的
activeTags是标签对象数组(和user_tags单条结构一致,而非你给出的纯ID数组),只需要把判断条件里的activeTagId改为activeTag.id即可:// 适用于activeTags是对象数组的场景 return this.state.activeTags.some(activeTag => modelTagIds.includes(activeTag.id)); - 注意你提供的错误代码里把
activeTags写成了单数形式activeTag,如果实际state里的键名是复数,拼写错误也会导致逻辑失效。
内容的提问来源于stack exchange,提问作者cmracar
相关产品推荐
相关产品推荐

