启用useExtendedSearch后,如何用Fuse.js过滤嵌套数组匹配项?
Fuse.js嵌套数组搜索:保留内层匹配项的实现
你当前的问题是:使用Fuse.js的useExtendedSearch搜索包含嵌套数组的对象时,能正确匹配到外层数组项,但返回结果里的内层数组未被过滤,希望只保留与关键词完全匹配的内层对象。
你的代码示例
const data = [{ "continent": "Asia", countries: [{ name: "Korea" }, { name: "Japan" }, { name: "China" }, { name: "Pakistan" }, ] }, { "continent": "Europe", countries: [{ name: "Albania" }, { name: "France" }, { name: "England" }, { name: "Spain" }, ] }, { "continent": "Africa", countries: [{ name: "Algeria" }, { name: "Angola" }, { name: "Benin" }, { name: "South Africa" }, ] } ] const options = { useExtendedSearch: true, keys: [ "continent", "countries.name" ] }; const fuse = new Fuse(data, options); // 搜索关键词 const pattern = "=Pakistan" console.log(fuse.search(pattern))
<script src="https://cdn.jsdelivr.net/npm/fuse.js@6.6.2"></script>
当前结果与期望结果对比
- 当前返回结果:返回整个亚洲大陆对象,包含所有国家
- 期望结果:返回亚洲大陆对象,但仅保留名称为"Pakistan"的国家
实现方案
Fuse.js默认只会返回匹配的外层父对象,不会自动过滤嵌套的子数组。要实现你的需求,需要在搜索结果的基础上手动过滤内层数组:
const pattern = "=Pakistan" // 执行Fuse搜索 const fuseResults = fuse.search(pattern); // 处理结果,过滤内层countries数组 const filteredResults = fuseResults.map(result => { const originalItem = result.item; // 提取关键词(去掉开头的=号) const keyword = pattern.slice(1); return { ...originalItem, countries: originalItem.countries.filter(country => country.name === keyword) }; }); console.log(filteredResults);
代码说明
- 先通过
fuse.search()获取匹配的外层对象 - 遍历每个搜索结果,解构原始对象并重新生成新对象
- 使用
filter()方法对countries数组进行过滤,只保留名称与关键词完全匹配的项 - 这里通过
pattern.slice(1)去掉扩展搜索语法的=前缀,得到纯关键词
如果需要支持更复杂的匹配规则(比如模糊匹配),可以结合Fuse返回的matches字段定位具体匹配的内层对象后再过滤,但对于你的完全匹配场景,上述方法足够简洁高效。
内容的提问来源于stack exchange,提问作者mahan
相关产品推荐
相关产品推荐

