JSON方法本身不提供扁平化能力,仅忠实序列化嵌套结构;真正扁平化需先用JSON深拷贝获取纯净副本,再递归展开为点号路径键值对,或改用structuredClone配合自定义遍历实现稳健扁平化。

JSON 方法本身不提供“扁平化”能力,它只是把嵌套对象按原始结构转成字符串再还原——结果仍是嵌套的,不是扁平的。所谓“扁平化序列化对比”,实际是指:先用 JSON 深拷贝得到一份干净副本,再基于该副本做键路径展开(如 user.profile.name)、值提取或结构重组,从而服务于日志记录、配置比对、表单回填等场景。
为什么不能直接靠 JSON.stringify 实现扁平化
JSON.stringify() 只负责忠实序列化 JavaScript 值为字符串,它:
- 保留全部嵌套层级,不会自动打散对象结构
- 跳过
undefined、函数、Symbol、循环引用等不可序列化项,导致信息丢失 - 把
Date变成 ISO 字符串、RegExp变成空对象、Map/Set直接消失 - 无法区分“空对象 {}”和“有意初始化的默认结构”
安全使用 JSON 深拷贝作为扁平化前置步骤
在确认业务数据满足前提时,可用 JSON.parse(JSON.stringify(obj)) 快速获得一个可预测、无引用副作用的纯数据副本:
- 数据只含 JSON 安全类型:字符串、数字、布尔、null、普通对象、数组
- 不含日期、正则、二进制、错误对象、DOM 节点、函数或 Symbol 属性
- 无循环引用或自引用(否则会抛
TypeError: cyclic object value) - 不需要保留原型方法或特殊构造行为
这一步的价值在于:排除副作用干扰,让后续扁平化逻辑只处理“数据内容”,不处理“对象身份”。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
在深拷贝副本上实现真正扁平化
拿到 JSON 拷贝后的 plain object 后,再用递归或迭代方式生成点号路径键值对:
- 例如
{user: {name: 'Alice', settings: {theme: 'dark'}}}→{'user.name': 'Alice', 'user.settings.theme': 'dark'} - 可配合
replacer参数预处理:过滤敏感字段、标准化时间格式、替换 undefined 为 null - 对比两个扁平化结果时,只需遍历键集,用
Object.keys()+for...in即可快速定位差异路径
注意:扁平化是业务动作,不是拷贝动作;JSON 拷贝只是帮你拿到一个“能放心扁平”的起点。
更稳妥的替代思路
若原始数据常含 Date/Map/Blob 等类型,或需保留结构语义,建议绕过 JSON 方法:
- 用
structuredClone()先做可靠深拷贝(现代环境) - 再基于 clone 结果,用自定义遍历器 + 类型判断做可控扁平化(例如对 Date 调用
.toISOString(),对 Map 转为Object.fromEntries(map)) - 封装成工具函数,统一处理业务中高频出现的“复杂对象 → 扁平快照”需求

















