在列表中搜索符合条件的内容

当我们创建笔记索引内容后,如何搜索是个关键的问题,目前的设计就是先搜索 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 方法,减少不必须要的循环。