如何利用 JSON.stringify 配合自定义过滤逻辑实现对深拷贝副本的“体积压缩”

秋明姑娘_5866

秋明姑娘_5866

2026-05-03

759人浏览

原创

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

如何利用 json.stringify 配合自定义过滤逻辑实现对深拷贝副本的“体积压缩”

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-jsapi-skill
dmap-jsapi-skill

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,可能失真)

因此,“体积压缩”本质是面向**数据传输与持久化场景**的取舍:牺牲部分类型保真度,换取更小的字符串体积和更快的序列化速度。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2095

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3162

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1076

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3619

7

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

0

15

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

0

18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习