如何使用Lodash移除嵌套对象数组中的空fieldGroup数组
需求说明
- 待处理数据为对象数组结构
- 需要移除所有嵌套层级中,值为空数组的
fieldGroup字段,存在有效内容的fieldGroup数组需完整保留 - 可使用Lodash、omit-deep-lodash或其他第三方工具库实现
如何使用Lodash移除嵌套层级的空数组?
示例原始数据
[ { "id": "sch_CV8e5NzZXwXhNp3TGnpryEmub2EC", "display_name": "test name", "connection_profile": { "type": "NAVIGATION", "access_methods": [ { "submit": true, "ui_web": [ { "id": "dslogo", "fieldGroup": [] // 待移除的空fieldGroup }, { "key": "label", "fieldGroup": [] // 待移除的空fieldGroup }, { "key": "forgotpassword", "fieldGroup": [ // 需保留的非空fieldGroup { "id": "forgotpassword", "key": "forgotpassword", "type": "link", "className": "d-flex flex-grow-1 justify-content-end", "templateOptions": { "label": "Need help?", "className": "pull-right", "hideRequiredMarker": true }, "_id": "62b4665e9bba345e1937f669" } ] } ], "navigator_method": "login", "_id": "62b4665e9bba345e1937f663" } ] } }, { "id": "sch_CV8e5NzZXwXhNp3TGnpryEmub2ED", "display_name": "test name 2", "connection_profile": { "type": "NAVIGATION", "access_methods": [ { "submit": true, "ui_web": [ { "key": "forgotpassword", "fieldGroup": [ { "id": "forgotpassword 11", "key": "forgotpassword 11", "type": "link 11" }, { "id": "forgotpassword 22", "key": "forgotpassword 22", "type": "link", "className": "d-flex flex-grow-1 justify-content-end" } ] }, { "id": "dslogo", "fieldGroup": [] }, { "key": "label", "fieldGroup": [] } ], "navigator_method": "login", "_id": "62b4665e9bba345e1937f663" } ] } } ]
实现方案
方案1:纯Lodash递归实现(无额外依赖)
不需要引入额外的深度删除工具,通过递归遍历所有嵌套层级,精准匹配需要删除的字段,逻辑完全可控,不会误删其他字段。
const _ = require('lodash'); function removeEmptyFieldGroup(data) { // 处理数组:递归遍历每一项 if (_.isArray(data)) { return data.map(item => removeEmptyFieldGroup(item)); } // 处理纯对象 if (_.isPlainObject(data)) { // 先递归处理当前对象下的所有属性值 const processedObj = _.mapValues(data, val => removeEmptyFieldGroup(val)); // 判定当前对象的fieldGroup是否为空数组,是则删除该字段 if (_.isArray(processedObj.fieldGroup) && processedObj.fieldGroup.length === 0) { return _.omit(processedObj, 'fieldGroup'); } return processedObj; } // 基础类型值(字符串、数字、布尔值等)直接返回 return data; } // 调用方法 const result = removeEmptyFieldGroup(原始待处理数据);
方案2:使用omit-deep-lodash实现(代码更简洁)
如果项目中已经引入了omit-deep-lodash工具库,可以直接传入自定义匹配规则,一行代码完成深度删除:
const _ = require('lodash'); const omitDeep = require('omit-deep-lodash'); const result = omitDeep(原始待处理数据, (value, key) => { // 匹配规则:键名为fieldGroup,且值为长度为0的空数组 return key === 'fieldGroup' && _.isArray(value) && value.length === 0; });
方案说明
- 两种方案都会返回全新的处理后数据,不会修改原始输入对象,避免产生副作用
- 处理后所有值为空数组的
fieldGroup字段会被完全移除,带有效内容的fieldGroup数组会完整保留,包括数组内部的嵌套结构 - 如果后续需要删除其他符合规则的字段,只需要调整判断函数里的匹配条件即可
内容的提问来源于stack exchange,提问作者Apurv Chaudhary
相关产品推荐
相关产品推荐

