首页/新闻资讯/正文详情

AdminJS flat.filterOutParams 完全指南:从扁平化参数中精准移除嵌套字段

发布时间:2026/9/25 5:10:29 来源:云帆数科 栏目:资讯中心
AdminJS flat.filterOutParams 完全指南:从扁平化参数中精准移除嵌套字段
后端低代码【免费下载链接】adminjsAdminJS is an admin panel for apps written in node.js项目地址https://gitcode.com/gh_mirrors/ad/adminjs点击查看免费下载导读flat.filterOutParams是 AdminJS 中flat模块提供的参数过滤工具用于从扁平化flatten的params对象中按路径移除一个或多个属性。在 AdminJS 后端处理数据库记录、前端表单提交的扁平化 payload 时经常需要剔除敏感字段、隐藏嵌套属性或剥离数组元素filterOutParams正是应对这一场景的精准减法工具。读完本文你将掌握其用法、嵌套路径匹配规则、多属性批量移除技巧以及底层正则实现原理并能在实际 AdminJS 项目中正确选用它与selectParams、removePath等兄弟工具。一、为什么需要 filterOutParamsAdminJS 的扁平化数据模型AdminJS 后端将所有数据库表/集合的信息存放在BaseRecord.params对象中前端则对应RecordJSON.params。为支持 JSONB 嵌套列、Mixed Schema 以及数组数据AdminJS 在写入params前会对所有数据做扁平化flatten处理如 flat.doc.md 所描述params: { name: John, surname: Doe, age: 28, // 嵌套对象 auth.facebook: some login token, auth.twitter: twitter login token, // 数组 interests.0: running, interests.1: jogging, }在这种扁平结构下顶层键是普通的name而嵌套字段的键名由路径 .分隔符拼接而成。这意味着按顶层键删除这类简单操作无法直接完成——要删除auth下所有字段需要匹配auth.facebook、auth.twitter等一系列以auth.开头的键。flat.filterOutParams正是为此设计的以路径为维度、以正则匹配为手段一次性移除某个路径及其全部子树对应的扁平键。二、基本用法与文档示例filterOutParams接收两个参数参数类型说明paramsFlattenParams扁平化的参数对象{ [key: string]: string \| boolean \| number \| Date \| null \| [] \| Recordstring, unknown \| File }见 flat.types.tspropertiesstring \| Arraystring要移除的属性路径可以传单个路径字符串也可以传路径数组批量移除返回值是一个新的FlattenParams对象其中所有匹配路径的键均被剔除。原文档给出的核心示例import flat from adminjs const params { name: John, education.school.name: Harvard, education.school.id: 123, } flat.filterOutParams(params, education.school) // 结果 { // name: John, // } flat.filterOutParams(params, name) // 结果 { // education.school.name: Harvard, // education.school.id: 123, // }可以看到传入education.school时不仅education.school本身若存在被移除所有以education.school为前缀的深层键如education.school.name、education.school.id也一并删除而传入顶层键name时由于扁平结构中只有name这一个键匹配其余嵌套键原样保留。注意原文档中第二个示例的调用名拼写为flat.filterOurParamstypo实际 API 为flat.filterOutParams。当前仓库中该函数在 filter-out-params.ts 定义并已挂载到 flat-module.ts 的flat命名空间导出可直接import { flat } from adminjs使用。三、嵌套路径与数组索引匹配规则详解扁平化数据的键名可能涉及深层嵌套与数组索引例如nested.1.property.0。filterOutParams的匹配依赖内部的正则生成器propertyKeyRegex见 property-key-regex.ts// 以 . 为分隔符构建形如 ^path($|\.) 的锚定正则 const escapedDelimiterOrIndex (${escapedDelimiter}|${escapedDelimiter}\\d${escapedDelimiter}) // includeAllSiblings 为真时路径中的 . 被替换为 (\.|\.\d\.)默认情况下传入的路径中的每个.会被替换为转义的\.最终生成^path($|\.)形式的正则即精确匹配路径本身或以路径 .开头的所有键。这正是education.school能同时命中education.school.name的原因。对于数组路径propertyKeyRegex支持includeAllSiblings选项由GetOptions定义意为包含所有同层兄弟元素。例如键nested.0.array.0与nested.1.array.0若想移除nested下所有数组分支的同名叶子可以借助该选项。不过filterOutParams的当前签名仅接收params与properties其内部调用propertyKeyRegex(propertyPath)时不传options因此默认按路径前缀 分隔符的严格子树匹配执行需要更灵活的兄弟级匹配时可参考其姊妹函数selectParams见下文后者完整支持GetOptions。四、批量移除传入字符串数组当需要一次性剔除多个属性时properties参数可以直接传入路径数组。看仓库测试 filter-out-params.spec.ts 中的真实用例const params { name: John, surname: Doe, age: 31, meta.description: very ugly, meta.title: cto, meta.otherInfo: he stinks, metadetaksamosone: this is a steroid, } flat.filterOutParams(params, [name, meta]) // 结果 { // surname: Doe, // age: 31, // metadetaksamosone: this is a steroid, // }几个值得注意的边界行为均有测试佐证数组内部顺序无关紧要[name, meta]与[meta, name]结果一致因为每个路径独立生成正则并依次过滤。前缀误伤防护移除meta不会误伤metadetaksamosone。原因在于生成的正则是^meta($|\.)metadetaksamosone不满足meta 后紧跟.或行尾的锚定条件这正是路径 分隔符匹配比简单startsWith更严谨的体现。无匹配时原样返回传入不存在的路径如nothingIsThere时函数返回与原对象相等deep.eq的副本不会抛错。undefined路径安全数组中混入undefined不会抛异常。这得益于源码中先执行propertyArray.filter((propertyPath) !!propertyPath)将空路径过滤掉后再进行归约见 filter-out-params.ts。五、源码实现剖析一行行看 filterOutParams 做了什么const filterOutParams ( params: FlattenParams, properties: string | Arraystring, ): FlattenParams { const propertyArray Array.isArray(properties) ? properties : [properties] return propertyArray .filter((propertyPath) !!propertyPath) .reduce((globalFiltered, propertyPath) { const regex propertyKeyRegex(propertyPath) return Object.keys(globalFiltered) .filter((key) !key.match(regex)) .reduce((memo, key) { memo[key] (params[key] as string) return memo }, {} as FlattenParams) }, params) }核心逻辑分四步参数归一化Array.isArray(properties) ? properties : [properties]将单个字符串包装为数组统一走数组流程。空路径过滤.filter((propertyPath) !!propertyPath)剔除空字符串、undefined等 falsy 路径保证后续propertyKeyRegex不会拿到非法输入。逐路径归约以params为初始值对每个路径生成对应的propertyKeyRegex然后遍历当前累积对象的全部键用!key.match(regex)保留不匹配的键。重建对象每个保留的键通过memo[key] params[key]复制到新对象最终返回全新的FlattenParams——原对象不会被修改符合函数式工具的设计预期。值得注意的是第 3 步中Object.keys(globalFiltered)与params[key]的配合由于归约链是串行的每一轮都基于上一轮过滤后的键集合继续过滤而取值始终来自原始params从而保证批量移除时不会因中间状态丢失而误取 undefined 值。六、与 selectParams、removePath 的分工协作flat模块是一组互补的工具导出见 flat-module.ts理解它们的边界能帮你写出更精准的代码selectParams正选与filterOutParams恰好相反保留匹配路径的键、丢弃其余。其源码 select-params.ts 与filterOutParams几乎镜像唯一差异是key.match(regex)与!key.match(regex)且selectParams额外支持GetOptions如includeAllSiblings。需要只要某子树时用它需要剔除某子树时用filterOutParams。removePath定点删除当路径涉及数组索引时单纯过滤键是不够的。以property.0 / property.1 / property.2三个键为例删除property.1不仅要移除该键还应把property.2重命名为property.1以保持数组下标连续。removePath在 remove-path.ts 中正是基于filterOutParams做第一层过滤再通过pathToParts、get、set检测数组父节点并执行splice重排。因此普通嵌套属性、对象子树→filterOutParams数组元素、需要保序压缩的路径→removePath批量剔除多个顶层/嵌套字段→filterOutParams(params, [a, b])或removePath逐个调用七、实际使用场景建议结合 AdminJS 的数据流filterOutParams的典型应用包括API 响应脱敏在自定义 action 返回记录前剔除auth.*、password.*等敏感路径避免扁平化 payload 将嵌套凭据一并带出。编辑场景的字段白名单减法配合selectParams使用先正选允许编辑的路径再反选其中需要排除的子路径形成精确的字段集合。前端表单同步RecordJSON.params是扁平结构修改某一子树后可用filterOutParams生成应删除部分的 payload与后端set/merge工具配合完成局部更新。调用方式统一为import { flat } from adminjs即 index.js 暴露的顶层入口函数本身纯函数、无副作用返回全新对象可放心用于状态管理场景。八、结语flat.filterOutParams以路径前缀 分隔符锚定的正则匹配解决了扁平化数据模型下删除一个字段 删除其整棵子树的难题并通过数组参数支持批量剔除、通过空路径过滤保证健壮性。结合 filter-out-params.spec.ts 中的测试用例嵌套删除、多属性删除、无匹配、undefined 路径你可以放心地在自己的 AdminJS 项目中复用这一模式当目标涉及数组索引时再升级到 remove-path.ts 的flat.removePath即可。赞分享后端低代码【免费下载链接】adminjsAdminJS is an admin panel for apps written in node.js项目地址https://gitcode.com/gh_mirrors/ad/adminjs点击查看免费下载相关推荐AdminJS flat.selectParams 完全指南从扁平化 params 中精确提取嵌套字段AdminJS flat.selectParams 完全指南从扁平化 params 中精确提取嵌套字段 AdminJS 在前后端之间以「扁平化」形式传输记录数后端低代码Apache Druid JSON Flatten Spec 完全指南在摄入期将嵌套 JSON 字段扁平化为列Apache Druid JSON Flatten Spec 完全指南在摄入期将嵌套 JSON 字段扁平化为列 JSON Flatten Spec扁平化规范数据库数据分析OLAP大数据实时分析数据仓库后端Akka Streams 嵌套与扁平化算子Nesting and Flattening Operators完全指南Akka Streams 嵌套与扁平化算子Nesting and Flattening Operators完全指南 Akka Streams 提供了一组将“后端并发编程异步编程上一篇推荐开源项目Quazip - 集成Qt的ZIP/UNZIP库封装下一篇Python Redis Lock分布式锁的强力助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

xmpp4cj调试技巧:3种调试器+报文拦截器,10分钟掌握XMPP通信观测方法
xmpp4cj调试技巧:3种调试器+报文拦截器,10分钟掌握XMPP通信观测方法

xmpp4cj调试技巧:3种调试器报文拦截器,10分钟掌握XMPP通信观测方法 【免费下载链接】xmpp4cj 一个模块化和可移植的开源XMPP客户端库 项目地址: https://gitcode.com/Cangjie-TPC/xmpp4cj xmpp4cj 是一个模块化和可移植的开源 XMPP 客户端库(基于 Cangjie 语… · 2026/9/25 5:10:29

Agent Skills实战:如何封装可复用、可验证的AI Agent技能模块
Agent Skills实战:如何封装可复用、可验证的AI Agent技能模块

做AI Agent这一年多,我最大的感受是:能让Agent真正“靠得住”的,不是更聪明的思考链,也不是堆更多工具,而是一套把能力沉淀成标准件的机制——agent-skills。这个说法在圈子里越来越流行,它不是什么新算法&… · 2026/9/25 5:10:29

SP3232双通道芯片:TTL转RS232电平转换电路设计全攻略
SP3232双通道芯片:TTL转RS232电平转换电路设计全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:10:23

源师兄手柄按键技巧:如何精准捕捉 C/D/E/F 按键的按下与松开?
源师兄手柄按键技巧:如何精准捕捉 C/D/E/F 按键的按下与松开?

源师兄手柄按键技巧:如何精准捕捉 C/D/E/F 按键的按下与松开? 【免费下载链接】gamepad 源师兄扩展项目: 手柄 | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/gamepad 源师兄手柄(gamepad) 是由源师兄组… · 2026/9/25 6:14:55

【Python机器学习】零基础掌握分类概率不可靠时的校准与决策
【Python机器学习】零基础掌握分类概率不可靠时的校准与决策

分类模型输出 0.8,是否能把它解释为“相似样本中约八成会发生目标事件”?模型把正样本排在负样本前面、默认阈值下分对类别,以及输出概率是否接近实际发生频率,是三个不同问题。需要按风险概率决定是否复检时,后一个问题尤其重要。 本文在可复现的模拟二分类数据上,把训… · 2026/9/25 6:14:55

Agent-Reach Reddit 通道配置实战:基于 rdt-cli 的搜索与阅读接入指南
Agent-Reach Reddit 通道配置实战:基于 rdt-cli 的搜索与阅读接入指南

人工智能AI AgentMCP 服务AI 技能CLI 【免费下载链接】Agent-Reach 给你的 AI Agent 一键装上互联网能力。13 个平台(网页/GitHub/YouTube/小红书/B站/Twitter/Reddit 等)多后端路由,当下最稳的接入方式替你选好、装好、体检好。GitHub 主仓库… · 2026/9/25 6:14:55

Sinon 中 mock.restore 完全指南:还原所有被 Mock 的方法及其底层实现原理
Sinon 中 mock.restore 完全指南:还原所有被 Mock 的方法及其底层实现原理

测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 mock.restore() 是 Sinon 中 Mock 对象提供的关键方法,用于将对象上所有被 Mock 的方法还原为… · 2026/9/25 6:14:49

win10下yolov6 tensorrt模型部署
win10下yolov6 tensorrt模型部署

TensorRT系列之 Win10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速部署… · 2026/9/25 6:14:49

win10下yolov7 tensorrt模型部署
win10下yolov7 tensorrt模型部署

TensorRT系列之 Win10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速部署… · 2026/9/25 6:14:49

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码