如何扁平化对象且保留$gt、$lt字段?flat库参数失效问题
自定义对象扁平化:保留含$gt/$lt的子对象不拆分
你遇到的问题是flat库的maxDepth参数没法灵活适配需求——既要扁平化任意深度的嵌套结构,又要对包含$gt/$lt的子对象停止扁平化。直接自己写个递归函数就能完美解决这个问题,不用依赖第三方库也能精准控制规则。
原始对象
{ values:{ gross_floor_area:{"$gt":200, "$lt":5000}, nested: {net_floor_area:{"$gt":200, "$lt":5000}} } }
期望结果
{ 'values.gross_floor_area': { '$gt': 200, '$lt': 5000 }, 'values.nested.net_floor_area': {"$gt":200, "$lt":5000} }
解决方案代码
function flattenObject(obj, parentKey = '', result = {}) { for (const [key, value] of Object.entries(obj)) { const currentKey = parentKey ? `${parentKey}.${key}` : key; // 只要当前对象包含$gt或$lt,就停止递归,直接保留原对象 if (typeof value === 'object' && value !== null && !('$gt' in value) && !('$lt' in value)) { flattenObject(value, currentKey, result); } else { result[currentKey] = value; } } return result; } // 测试用例 const originalObj = { values:{ gross_floor_area:{"$gt":200, "$lt":5000}, nested: {net_floor_area:{"$gt":200, "$lt":5000}} } }; const flattenedResult = flattenObject(originalObj); console.log(flattenedResult);
逻辑说明
- 递归遍历对象的每一层键值对,自动拼接层级式的键名(比如
values.nested.net_floor_area) - 遇到包含
$gt或$lt的子对象时,直接将整个对象存入结果,不再继续递归拆分 - 普通的嵌套对象会一直被扁平化,直到遇到需要保留的目标对象或非对象类型的值
这个方法完全适配你的需求,不管嵌套层级有多深,只要子对象里没有$gt/$lt就会被扁平化,反之则完整保留。
内容的提问来源于stack exchange,提问作者Rickhomes
相关产品推荐
相关产品推荐

