讲师中心 微信公众号
AI工具推荐 视频效率加速

使用 JSON.parse 与 reviver 函数深度修改嵌套对象属性

云涛君_9873

云涛君_9873

发布时间:2025-11-16 14:32:12

|

188人浏览过

|

来源于php中文网

原创

使用 JSON.parse 与 reviver 函数深度修改嵌套对象属性

本文探讨了如何在javascript中高效地处理具有未知深度嵌套的对象结构,并批量修改其内部属性。我们将重点介绍一种利用 `json.parse` 的 `reviver` 函数进行深度遍历和属性转换的简洁方法,该方法无需手动递归,即可实现对所有层级指定属性的统一设置,并分析其优缺点及适用场景。

深度嵌套对象属性修改的挑战

在前端开发中,我们经常会遇到结构复杂、层级不定的数据对象,例如树形结构、菜单配置或文件系统表示等。这类对象通常包含 children 属性,其内部又可能嵌套相同结构的对象。当需要对所有层级中的某个特定属性(例如 ative 状态)进行统一修改时,传统的循环(如 forEach、map)或手动递归方法可能会变得复杂且冗长,尤其是在对象深度未知的情况下。

例如,考虑以下对象结构,其中 ative 属性可能在任何层级出现,并且 children 数组的深度是可变的:

const obj = {
  name: 'obj1',
  ative: true,
  children: [
    {
      name: 'obj2',
      ative: true,
      children: [
        {
          name: 'Obj23',
          ative: true,
          children: [] // 可能是空数组,表示没有子节点
        }
      ]
    },
    {
      name: 'obj3',
      children: [ // 注意:此对象本身没有 ative 属性
        {
          name: 'Obj32',
          ative: true,
          children: []
        }
      ]
    }
  ]
};

我们的目标是遍历 obj 及其所有子孙节点,将所有存在的 ative 属性设置为 false。

利用 JSON.parse 与 reviver 函数进行深度转换

JavaScript 的 JSON 对象提供了一个非常强大的机制来实现对深层对象的转换:JSON.parse() 方法的第二个参数——reviver 函数。reviver 函数允许我们在解析JSON字符串时,对每个键值对进行检查和转换。

工作原理

  1. JSON.stringify(obj): 首先,我们将原始对象 obj 转换为其JSON字符串表示。这一步实际上创建了一个原始对象的深拷贝,因为JSON字符串不包含引用。

  2. JSON.parse(jsonString, reviver): 接着,我们使用 JSON.parse 将JSON字符串解析回JavaScript对象。在解析过程中,reviver 函数会为JSON字符串中遇到的每一个键值对(包括嵌套对象和数组中的元素)被调用。

    Aria2 Json Rpc
    Aria2 Json Rpc

    通过 JSON‑RPC 2.0 与 aria2 下载管理器交互,使用自然语言命令管理下载、查询状态并控制任务。适用于 aria2、下载管理或种子操作。

    下载

    reviver 函数的签名是 function(key, value),它接收当前处理的键 (key) 和值 (value) 作为参数。该函数的返回值将替换原始值:

    • 如果 reviver 返回 value,则该键值对保持不变。
    • 如果 reviver 返回一个不同的值,则该键值对的值将被替换为新的返回值。
    • 如果 reviver 返回 undefined,则该键值对将从结果对象中删除。

示例代码

针对上述问题,我们可以这样使用 JSON.parse 和 reviver 来将所有 ative 属性设置为 false:

const obj = {
    name: 'obj1',
    ative: true,
    children: [{
        name: 'obj2',
        ative: true,
        children: [{
            name: 'Obj23',
            ative: true,
            children: []
        }]
    },
    {
        name: 'obj3',
        children: [{
            name: 'Obj32',
            ative: true,
            children: []
        }]
    }]
};

const result = JSON.parse(JSON.stringify(obj), (key, value) => {
    // 如果当前键是 'ative',则将其值设置为 false
    if (key === 'ative') {
        return false;
    }
    // 否则,返回原始值,保持不变
    return value;
});

console.log(result);

运行上述代码,result 对象将是 obj 的一个深拷贝,但其中所有名为 ative 的属性都已被设置为 false:

/* console.log(result) 的输出 */
{
  name: 'obj1',
  ative: false, // 已被修改
  children: [
    {
      name: 'obj2',
      ative: false, // 已被修改
      children: [
        {
          name: 'Obj23',
          ative: false, // 已被修改
          children: []
        }
      ]
    },
    {
      name: 'obj3',
      children: [
        {
          name: 'Obj32',
          ative: false, // 已被修改
          children: []
        }
      ]
    }
  ]
}

代码解析

  • JSON.stringify(obj): 将原始 obj 转换为JSON字符串。
  • (key, value) => key === 'ative' ? false : value: 这是一个箭头函数,作为 reviver 传递给 JSON.parse。
    • 它会检查每个键。如果 key 等于字符串 'ative',那么它就返回 false。
    • 对于所有其他键,它返回原始的 value,不做任何修改。
    • 这种机制确保了只有目标属性被修改,而其他属性和结构保持不变。

注意事项与局限性

虽然 JSON.parse 结合 reviver 提供了一种简洁的解决方案,但它并非适用于所有场景。在使用时需要注意以下几点:

  1. 数据类型限制:JSON.stringify 无法正确处理所有JavaScript数据类型。它会:
    • 忽略函数(function)、undefined 和 Symbol 值。
    • 将 Date 对象转换为ISO格式的字符串。
    • 将 RegExp 和 Error 对象转换为 {}。
    • 如果对象包含循环引用,JSON.stringify 将抛出错误。 因此,如果你的对象包含这些特殊类型或循环引用,此方法可能不适用。
  2. 性能开销:对于非常庞大的对象,先将其转换为字符串再解析回对象可能会比直接的递归遍历消耗更多的CPU和内存资源。在对性能要求极高的场景下,传统的递归方法可能更为高效。
  3. 深拷贝特性:此方法总是会生成一个全新的深拷贝对象。这意味着原始对象不会被修改。如果你的需求是原地修改原始对象,那么你需要采用其他方法(如递归遍历)。
  4. 键的匹配:reviver 函数只根据键名进行匹配。如果你的需求是根据键值、数据类型或更复杂的逻辑进行判断和修改,reviver 仍然能够胜任,只需在回调函数中添加相应的判断逻辑即可。

总结

利用 JSON.parse 与 reviver 函数是处理深度嵌套对象并批量修改特定属性的一种优雅且高效的方法。它通过将对象序列化再反序列化的过程,巧妙地利用了 reviver 的回调机制,避免了手动编写复杂的递归逻辑。然而,开发者在使用此方法时,必须充分了解其对数据类型的限制以及性能影响,并根据具体需求权衡选择。对于结构相对简单、不含特殊数据类型且需要深拷贝并转换的场景,这无疑是一个极佳的解决方案。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

1975

2023.08.07

json是什么
json是什么

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

2722

2023.08.23

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

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

936

2023.10.13

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

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

3039

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2451

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

494

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

422

2026.02.12

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

698

2025.12.04

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn