
本文介绍如何扩展 JavaScript 的嵌套 JSON 状态过滤函数,使其同时兼容字符串(如 'pass')和字符串数组(如 ['pass', 'failed'])输入,通过 some() 与 flat() 实现统一、健壮的多条件匹配逻辑。
本文介绍如何扩展 javascript 的嵌套 json 状态过滤函数,使其同时兼容字符串(如 `'pass'`)和字符串数组(如 `['pass', 'failed']`)输入,通过 `some()` 与 `flat()` 实现统一、健壮的多条件匹配逻辑。
在处理测试报告、日志聚合或 API 响应等嵌套结构数据时,常需根据 results 数组中对象的 status 字段进行动态筛选。原始实现仅支持单个状态字符串(如 'failed'),但实际场景中往往需要「任一匹配」(OR 逻辑)——例如同时获取 PASS 和 FAILED 的结果,或未来支持自定义状态如 'SKIPPED'、'TIMEOUT'。
核心改进在于将过滤逻辑从严格相等(===)或单字符串包含(.includes())升级为可扩展的多值模糊匹配。关键点有二:
- 支持 OR 逻辑的多值匹配:使用 Array.prototype.some() 遍历状态候选列表,只要 results.status.toLowerCase() 包含任一目标值即保留该对象;
- 统一输入类型处理:利用 [status_word].flat(1) 将字符串自动转为单元素数组(如 'pass' → ['pass']),使函数签名保持向后兼容,无需调用方区分传参类型。
以下是完整、生产就绪的实现:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
function filterByStatus(data, statusWord) {
return data.map(element => ({
...element,
results: element.results?.filter(result =>
[statusWord].flat(1).some(word =>
result.status?.toLowerCase().includes(word.toLowerCase())
)
) || []
}));
}
// 使用示例
const test_data = {
"test_name": "test1",
"plan": "asasas",
"country": "some country",
"date_created": "2023-07-10T10:55:42.253000",
"date_last_updated": "2023-07-10T10:55:42.253000",
"owner": { "RowID": "G_6", "TaskName": "Like a G6", "Freq": "474.0" },
"results": [
{ "id": 1, "row_id": "G_6", "status": "PASS", "date_created": "2023-07-11T07:43:23.807962" },
{ "id": 2, "row_id": "G_6", "status": "FAILED", "date_created": "2023-08-01T12:05:40.973614" },
{ "id": 3, "row_id": "G_7", "status": "SKIPPED", "date_created": "2023-08-02T09:20:15.112345" }
]
};
console.log(filterByStatus([test_data], 'pass'));
// → 仅保留 status 包含 'pass' 的结果(如 PASS)
console.log(filterByStatus([test_data], ['pass', 'failed']));
// → 保留 status 包含 'pass' 或 'failed' 的结果(PASS + FAILED)
console.log(filterByStatus([test_data], ['PASS', 'Skipped']));
// → 不区分大小写,仍能正确匹配(PASS + SKIPPED)✅ 注意事项:
- 使用可选链 ?.(element.results?.filter(...) 和 result.status?.toLowerCase())避免 undefined 报错,提升鲁棒性;
- 对 statusWord 和 result.status 均调用 toLowerCase(),确保大小写不敏感匹配;
- 显式返回空数组 || [],防止 results 字段缺失时产生 undefined;
- 函数接收 data 参数而非硬编码 test_data,增强复用性与单元测试友好性。
该方案无需修改原始数据结构,零依赖,适用于浏览器环境与 Node.js,并可轻松集成至 React/Vue 数据处理逻辑或 CLI 工具中。

















