在列表中搜索符合条件的内容
当我们创建笔记索引内容后,如何搜索是个关键的问题,目前的设计就是先搜索 name,看名称中是否包含关键字,然后查找 kws 数组,查看数组中是否有关键字,最后查看 tags 数组中是否有关键字?查到以后取出来,返回数组列表。
数据的结构如下:
[{
"id":"id1",
"name":"小星星",
"kws":["爱","崇拜"],
"tags":["想法","感情"],
}]
如果使用 JS 来实现,那么代码如下:
/**
* 搜索笔记
* @param {Array} notes 笔记数组
* @param {String} keyword 搜索关键词
* @returns {Array} 匹配的笔记数组
*/
function searchNotes(notes, keyword) {
if (!keyword || typeof keyword !== 'string') {
return []; // 如果关键词无效,返回空数组
}
// 统一转换为小写以便不区分大小写搜索
const lowerKeyword = keyword.toLowerCase();
return notes.filter(note => {
// 检查名称是否包含关键词
const nameMatch = note.name && note.name.toLowerCase().includes(lowerKeyword);
// 检查kws数组是否包含关键词
const kwsMatch = Array.isArray(note.kws) &&
note.kws.some(kw => kw && kw.toLowerCase().includes(lowerKeyword));
// 检查tags数组是否包含关键词
const tagsMatch = Array.isArray(note.tags) &&
note.tags.some(tag => tag && tag.toLowerCase().includes(lowerKeyword));
// 如果任一条件匹配,则包含该笔记
return nameMatch || kwsMatch || tagsMatch;
});
}
这里支持多维度搜索,同时搜索名称、关键词和标签三个字段,当搜索时,先将关键字转为小写,这样比较时不区分大小写。为了性能优化,使用 filter 和 some 方法,减少不必须要的循环。