本文介绍一种基于 map + filter 的链式操作方法,用于在按日期分组的事件数组中精准搜索标题或摘要中包含指定关键词的事件,并保持原始分组结构,自动剔除无匹配项的空分组。
本文介绍一种基于 `map` + `filter` 的链式操作方法,用于在按日期分组的事件数组中精准搜索标题或摘要中包含指定关键词的事件,并保持原始分组结构,自动剔除无匹配项的空分组。
在处理日程类、日志类或内容聚合型数据时,常见将事件按日期(如 "groupKey": "2023-10-12")分组存储的结构。但当需要全局搜索(例如查找所有含 "word" 的标题或摘要)时,直接使用 Array.prototype.filter() 无法穿透嵌套层级;而简单遍历又易破坏原有分组结构或遗漏空组清理。
正确的解决思路是两阶段处理:
- 逐组映射(map):对每个分组对象,保留其 groupKey,同时对其 events 数组执行过滤,仅保留 title 或 abstract 中包含搜索词的事件(注意忽略大小写);
- 整体筛选(filter):移除经上一步处理后 events 为空数组的分组,确保结果紧凑且结构完整。
以下是可直接运行的实现代码:
function searchEvents(data, searchTerm) {
if (!Array.isArray(data) || typeof searchTerm !== 'string') {
return [];
}
const lowerSearchTerm = searchTerm.toLowerCase();
return data
.map(group => {
// 安全校验:确保 group 和 group.events 存在且为数组
const events = Array.isArray(group.events) ? group.events : [];
const filteredEvents = events.filter(event =>
typeof event === 'object' &&
(event.title?.toLowerCase().includes(lowerSearchTerm) ||
event.abstract?.toLowerCase().includes(lowerSearchTerm))
);
return {
...group,
events: filteredEvents
};
})
.filter(group => Array.isArray(group.events) && group.events.length > 0);
}
// 使用示例
const eventData = [
{
"groupKey": "2023-10-12",
"events": [
{ "uid": "4bd2d222", "title": "LEAVE IT TILL LATER", "abstract": "the only exception to made up words..." }
]
},
{
"groupKey": "2023-10-19",
"events": [
{ "uid": "7bbd8c4f", "title": "PLAY ON WORDS", "abstract": "Wordplay is great fun..." },
{ "uid": "LeIaCRXmr", "title": "TRY TO AVOID MADE UP WORDS", "abstract": "try to avoid made up words..." }
]
}
];
console.log(searchEvents(eventData, "word"));
// 输出包含所有含 "word"(不区分大小写)的事件,且保留原始 groupKey 分组结构
✅ 关键优势:
- 严格维持输入数据的嵌套结构([{groupKey, events: [...]}, ...]),便于前端渲染或后续处理;
- 自动跳过 null/undefined 事件或缺失字段,增强鲁棒性;
- 时间复杂度为 O(n×m),其中 n 是分组数,m 是各组平均事件数,适用于中等规模数据;
- 支持中文、英文及混合文本搜索(依赖 String.prototype.includes() 的 Unicode 兼容性)。
⚠️ 注意事项:
- 如需支持正则高级匹配(如词边界 \bword\b)、模糊搜索或性能优化(如构建倒排索引),建议引入专用库(如 fuse.js)或预处理索引;
- 在大型数据集(>10,000 事件)中,可考虑结合 Web Worker 避免阻塞主线程;
- 若搜索频率极高,建议对 title 和 abstract 字段做去噪、分词缓存,提升响应速度。
该方案简洁、可读性强,是处理分组嵌套数据搜索的经典范式,推荐作为标准工具函数集成至项目工具库中。











