
本文介绍如何扩展单值状态过滤函数,支持传入字符串或字符串数组(如 ['pass', 'failed']),动态匹配嵌套 results 中任意对象的 status 字段(不区分大小写),并安全保留原始数据结构。
本文介绍如何扩展单值状态过滤函数,支持传入字符串或字符串数组(如 ['pass', 'failed']),动态匹配嵌套 results 中任意对象的 status 字段(不区分大小写),并安全保留原始数据结构。
在实际数据处理中,常需对嵌套 JSON 的 results 数组按 status 字段进行条件筛选。原始实现仅支持单个状态字符串(如 'pass'),但业务场景往往需要“多值 OR 匹配”——例如同时获取 PASS 和 FAILED 的记录,或兼容未来新增的状态类型(如 'SKIPPED'、'PENDING')。关键在于让过滤逻辑具备类型自适应能力:既能接收字符串,也能接收字符串数组,且无需硬编码状态枚举。
核心改进在于替换 .filter() 内部的判断逻辑。原代码使用 results.status.toLowerCase().includes(status_word),仅适用于单一字符串;升级后采用 [status_word].flat(1).some(x => ...) 模式:
- [status_word].flat(1) 将输入统一转为一维数组:若传入字符串 'pass',则变为 ['pass'];若传入数组 ['pass', 'failed'],则保持不变;
- .some(x => results.status.toLowerCase().includes(x)) 对每个候选状态值执行子串匹配(注意:includes 支持部分匹配,如 'pass' 可匹配 'PASSED';若需精确匹配,应改用 ===)。
以下是完整、健壮的实现示例:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
function filterByStatus(data, statusWord) {
// 安全处理:确保 data.results 存在且为数组
if (!data || !Array.isArray(data.results)) {
console.warn('Invalid input: data.results is not an array');
return { ...data, results: [] };
}
return {
...data,
results: data.results.filter(result => {
if (!result || typeof result.status !== 'string') return false;
const normalizedStatus = result.status.toLowerCase();
// 统一处理字符串或数组输入
const targets = Array.isArray(statusWord)
? statusWord.map(s => s.toLowerCase())
: [statusWord.toLowerCase()];
return targets.some(target => normalizedStatus.includes(target));
})
};
}
// 使用示例
const testData = { /* 如题所示的 test_data 对象 */ };
// ✅ 单值过滤
console.log(filterByStatus(testData, 'pass'));
// ✅ 多值 OR 过滤(返回 status 包含 'pass' 或 'failed' 的所有项)
console.log(filterByStatus(testData, ['pass', 'failed']));
// ✅ 兼容大小写与空格(传入 'Failed' 仍可匹配 'FAILED')
console.log(filterByStatus(testData, ['Failed']));
⚠️ 注意事项:
- 匹配精度:当前使用 includes() 实现模糊匹配(子串匹配),适合状态命名存在变体(如 'PASSED'/'PASS')的场景;若要求严格相等,请将 includes(target) 替换为 === target;
- 性能提示:对于超大数据集(>10k 条 results),建议预先构建 Set 提升查找效率;
- 错误防御:函数增加了对 data.results 类型和 result.status 存在性的校验,避免运行时报错;
- 不可变性:始终返回新对象,不修改原始数据,符合函数式编程最佳实践。
该方案轻量、通用、无外部依赖,可直接集成至前端数据预处理或 Node.js 后端响应过滤逻辑中。










