json.stringify配合replacer参数可实现数据体积压缩:用数组精准保留指定字段,用函数动态过滤敏感/冗余内容,再parse可得轻量对象,但会丢失函数、undefined、symbol等非json安全类型。

JSON.stringify 本身不直接支持深拷贝,但它配合 replacer 参数可实现对序列化过程的精细控制——这正是“体积压缩”的关键:在生成字符串前,有选择地剔除、简化或替换掉不需要的字段或冗余数据,从而让最终副本更轻量。注意:这不是传统意义的深拷贝(它不返回对象),而是生成一个精简后的 JSON 字符串;若需对象,再用 JSON.parse 还原即可(但还原后仍是浅结构,且会丢失函数、undefined、Symbol、Date 等非 JSON 安全类型)。
用 replacer 数组精准排除指定字段
最简单有效的压缩方式是通过字符串数组明确列出要保留的键名,其余一概忽略:
示例:只保留用户核心信息const user = {
id: 123,
name: "Alice",
email: "a@example.com",
passwordHash: "xxx", // 敏感字段
createdAt: new Date(),
metadata: { temp: true, debug: "verbose" },
settings: { theme: "dark", notifications: true }
};
// 只保留 id、name、email、settings.theme
const keptKeys = ["id", "name", "email", "settings"];
const compressed = JSON.stringify(user, keptKeys, 2);
// → 输出中 settings 是完整对象,但 metadata、passwordHash、createdAt 全部消失
注意:replacer 数组只作用于**顶层及显式列出的嵌套路径**,不会自动递归过滤子属性。若想进一步压缩 settings,需改用函数形式。
用 replacer 函数实现动态逻辑过滤
函数形式能逐层访问每个键值对,支持条件判断、类型检查、路径追踪等高级压缩策略:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 跳过敏感字段:
if (key === 'password' || key === 'token') return undefined; - 移除空值或默认值:
if (value == null || value === '' || value === false) return undefined; - 扁平化嵌套结构:
if (key === 'address' && typeof value === 'object') return `${value.city}, ${value.zip}`; - 限制数组长度:
if (Array.isArray(value) && key === 'history') return value.slice(-5); // 只留最近5条
函数接收 (key, value),返回 undefined 表示剔除该字段,返回其他值则使用该值参与序列化。
结合路径上下文做层级感知压缩
单纯靠 key 名易误伤(比如多个对象都有 id,但有的要留、有的要删)。可在 replacer 函数中维护当前路径,实现更安全的过滤:
function compressReplacer(key, value) {
const path = this.path || [];
const currentPath = [...path, key];
// 只在 metadata.debug 或 config.debug 路径下移除 debug 字段
if (key === 'debug' && (currentPath.join('.').includes('metadata.debug') ||
currentPath.join('.').includes('config.debug'))) {
return undefined;
}
// 避免循环引用(JSON.stringify 默认会报错,这里主动跳过)
if (value && typeof value === 'object' && value !== this.root) {
this.path = currentPath;
}
return value;
}
// 使用时需绑定上下文
const context = { root: user, path: [] };
const result = JSON.stringify(user, compressReplacer.bind(context));
压缩后还原为对象的注意事项
若需从压缩后的 JSON 字符串得到轻量对象,执行 JSON.parse(compressed) 即可。但必须清楚以下限制:
- 函数、undefined、Symbol、BigInt、Date 对象、RegExp 等无法被 JSON 表示的类型会丢失或转为 null/字符串
- 原型链、constructor、getter/setter 全部丢失
- 循环引用直接导致
JSON.stringify报错(需在 replacer 中提前检测并跳过) - 数字精度可能受影响(如极大整数转为科学计数法字符串后再 parse,可能失真)
因此,“体积压缩”本质是面向**数据传输与持久化场景**的取舍:牺牲部分类型保真度,换取更小的字符串体积和更快的序列化速度。










