如何使用toJson和parseJson方法实现JSON的深拷贝,特别是包含函数的情况?

本文介绍一种实现json深拷贝的方法,尤其针对包含函数的情况。该方法包含两个核心函数:tojsonparsejson,分别用于将对象序列化为json字符串并还原json字符串为对象,同时完整保留函数信息。

如何使用toJson和parseJson方法实现JSON的深拷贝,特别是包含函数的情况?

tojson 函数:序列化对象为JSON字符串

该函数利用JSON.stringify方法将对象转换为JSON字符串。关键在于其第二个参数,一个自定义函数,用于处理函数类型的属性。该函数会识别并用特殊前缀和后缀包裹函数代码,从而在序列化过程中保存函数信息。 ES5和ES6箭头函数均被支持。

import deepextend from './deepextend';const prefix = '[[form-create-prefix-';const suffix = '-form-create-suffix]]';const $t = '$fn:';const functionKeyword = 'function'; // 使用更清晰的变量名export function tojson(obj, space) {    return JSON.stringify(deepextend([], obj, true), function (key, val) {        if (typeof val !== functionKeyword) {            return val;        }        if (val.__json) {            return val.__json;        }        if (val.__origin)            val = val.__origin;        if (val.__emit)            return undefined;        return prefix + val + suffix;    }, space);}

parsejson 函数:将JSON字符串还原为对象

该函数使用JSON.parse方法将JSON字符串解析回对象。同样,其第二个参数是一个自定义函数,用于处理被特殊标记的函数字符串。它会识别并使用makefn函数将函数字符串还原为可执行的函数对象。

import is, {hasproperty} from './type';function makefn(fnString) {    return (new Function('return ' + fnString))(); // 使用Function构造函数更清晰}export function parsefn(fn, mode) {    if (fn && is.string(fn) && fn.length > 4) {        let v = fn.trim();        if (v.indexOf(suffix) > 0 && v.indexOf(prefix) === 0) {            v = v.replace(suffix, '').replace(prefix, '');            return makefn(v);        } else if (v.indexOf($t) === 0) {            v = v.replace($t, '');            return makefn(v);        } else if (!mode && v.indexOf(functionKeyword) === 0 && v !== functionKeyword) {            return makefn(v);        }    }    return fn;}export function parsejson(jsonString, mode) {    return JSON.parse(jsonString, function (k, v) {        if (is.undef(v) || !v.indexOf) return v; // 使用更清晰的条件判断        return parsefn(v, mode);    });}

使用方法示例:

const data = {    rule: [        {            type: "input",            field: "goods_name",            title: "商品名称",            on: {                change: function (val) {                    console.log("aa", val);                },                input: (val) => {                    console.log("bb", val);                },            },        },    ],};const jsonStr = tojson(data);const dataCopy = parsejson(jsonStr);

通过以上步骤,即可实现包含函数的JSON对象的深拷贝。 代码中已对变量名和代码逻辑进行了一些优化,使其更易于理解和维护。 请确保deepextendtype模块已正确引入。

以上就是如何使用toJson和parseJson方法实现JSON的深拷贝,特别是包含函数的情况?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1502397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 00:40:26
下一篇 2025年12月20日 00:40:41

相关推荐

  • 如何用JSON序列化和反序列化包含ES5和ES6箭头函数的对象?

    JSON序列化与反序列化:完美处理ES5和ES6函数 本文介绍一种方法,能够将包含ES5函数和ES6箭头函数的对象转换为JSON字符串,并在反序列化时完整恢复这些函数。 解决方案 我们将借助第三方库form-create来实现这一目标。该库提供两个关键函数: toJson(obj, space): …

    2025年12月20日
    000
  • 浅副本和深副本

    浅拷贝与深拷贝:JavaScript 对象复制详解 本文深入探讨 javascript 中的浅拷贝和深拷贝,并通过示例代码清晰地展现两者之间的差异。理解这两种拷贝方式对于避免潜在的程序错误至关重要。 1. 浅拷贝 浅拷贝创建一个新对象,但只复制顶层属性。对于嵌套对象或数组,浅拷贝只复制其引用,而非创…

    2025年12月19日
    000
  • 掌握 JavaScript 中的数字方法

    javascript 中的数字方法 javascript 提供了多种内置方法来有效地处理数字。这些方法允许您执行格式化、舍入、解析和验证数字等操作。 1.转换数字 a. tostring() 将数字转换为字符串。 const num = 123;console.log(num.tostring())…

    好文分享 2025年12月19日
    000
  • js 如何遍历json

    通过将 JSON 字符串解析为 JavaScript 对象,您可以使用循环遍历其键和值。使用 for…in 循环可以遍历键,而 Object.keys() 和 forEach() 可以遍历值。如果 JSON 对象包含数组,可以使用 Array.forEach() 方法遍历其中的元素。 如…

    2025年12月19日
    000
  • 如何使用 JavaScript 遍历 JSON 数组?

    在 javascript 中遍历 json 数组 在处理 json 数据时,遍历数组中的元素至关重要。本文将指导您使用 javascript 遍历 json 数组,从而访问和处理其中的数据。 在您的代码示例中,已通过 eval() 函数解析了 info.filelist 中的 json 字符串。要遍…

    2025年12月19日
    000
  • 如何将包含动态键名的 JSON 字符串解析成键值对类型?

    关于一个动态 json 字符串的解析问题 问题 我们从后台获取到一个包含动态键名的 json 字符串,需要将其解析成一个 javascript 类型,该类型包含一个键值对,其中键是动态键名,值是键名对应的值。 问题示例 给定以下 json 字符串: [ { “name”: “2015年”, “sta…

    2025年12月19日
    000
  • 如何将动态 JSON 字符串解析为键值对映射,以存储不同统计类型下的数据?

    解析动态 json 字符串为键值对映射 给定一个 json 字符串,我们需要将其解析为一个 javascript 对象,并以键值对映射的形式存储字段值。 问题重述 如何将以下 json 字符串解析为一个可变 stattype 映射? [ { “name”: “2015年”, “stattotal”:…

    2025年12月19日
    000
  • NodeJS 中如何避免 UTC 时间戳自动转化为本地时间戳?

    如何在 nodejs 中避免 utc 时间戳自动转化为本地时间戳 在获取 utc 时间并转化为时间戳时,可能会遇到 utc 时间戳自动转化为本地时间戳的问题。本文将详细介绍问题并提供解决方案。 问题: const utc = new date().toutcstring();console.log(…

    2025年12月19日
    000
  • js中如何新建json

    如何在 JavaScript 中创建 JSON?通过 JSON.parse() 解析 JSON 字符串。使用 new JSON() 创建空对象并添加键值对。使用对象字面量直接创建 JSON 字符串。 如何在 JavaScript 中创建 JSON 在 JavaScript 中创建 JSON 对象非常…

    2025年12月19日
    000
  • js 如何定义json

    JSON 是一种轻量级的文本格式,用于表示结构化数据,尤其是在 Web 开发中。它使用对象(键值对集合)和数组(有序元素集合)来表示数据。在 JavaScript 中,可以使用 JSON.parse() 和 JSON.stringify() 方法在 JSON 字符串和对象之间进行转换,从而实现跨平台…

    2025年12月19日
    000
  • js函数如何进行深拷贝

    深拷贝可以复制对象或数组的所有数据,包括嵌套结构,以防止修改新变量时影响原始对象。实现方式包括:JSON 序列化/反序列化递归函数Spread 运算符(ES6+) JS 函数进行深拷贝的实现方式 在 JavaScript 中,深拷贝是一种将对象或数组中的所有数据(包括嵌套的对象和数组)复制到新变量中…

    2025年12月19日
    000
  • js如何解析js字符串

    如何解析 JavaScript 字符串?JSON 解析:使用 JSON.parse() 方法解析 JSON 对象表示法 (JSON) 字符串。XML 解析:使用 DOMParser.parseFromString() 方法或 XMLHttpRequest 对象解析可扩展标记语言 (XML) 字符串。…

    2025年12月19日
    000
  • js中如何判断输入数字

    JavaScript 中判断输入数字的方法有:isNaN() 函数检查值是否是非数字。typeof 运算符返回值的类型,对于数字类型为“number”。正则表达式用于验证数字,如 /^[0-9]+$/。parseFloat() 函数尝试将字符串解析为浮点数,失败时返回 NaN。 如何在 JavaSc…

    2025年12月19日
    000
  • js如何判断是数字

    要判断一个值是否是数字,JavaScript 提供了多种方法:isNaN() 函数检查该值是否不是数字。Number.isFinite() 函数检查该值是否是有限数字。typeof 操作符返回该值的类型,如果是数字则为 “number”。instanceof Number 检…

    2025年12月19日
    000
  • 每个开发人员都应该了解的高级 JavaScript 概念

    javascript 是许多开发人员日常使用的语言,但其生态系统中存在许多隐藏的瑰宝,即使是经验丰富的开发人员也可能不熟悉。本文探讨了一些鲜为人知的 javascript 概念,它们可以显着提高您的编程技能。我们将介绍诸如 代理、符号、生成器 等概念,并通过示例演示每个概念并解决问题以说明其强大功能…

    好文分享 2025年12月19日
    000
  • 抛弃 dotenv:Nodejs 现在原生支持 env 文件加载

    node.js 环境管理的主要内容之一是使用 dotenv 包,它有助于从 .env 文件加载环境变量。然而,node.js 最近的更新引入了内置功能,可以减少或消除对 dotenv 等外部包来管理环境变量的需求。 本机 .env 文件处理 从版本 20.6.0 开始,node.js 允许在执行脚本…

    2025年12月19日
    000
  • C++如何解析JSON_使用nlohmann/json库处理C++中的JSON数据

    nlohmann/json库通过单头文件实现C++中JSON的解析与生成,支持字符串解析、对象构建、数组嵌套及自定义类型序列化,语法简洁且功能完整,极大简化了数据交换与配置处理。 在C++中处理JSON数据一直是个挑战,因为语言标准库没有内置支持。但使用第三方库 nlohmann/json 可以让这…

    2025年12月19日
    000
  • C++中的std::stringstream怎么用?C++字符串与流的转换技巧【实用教程】

    std::stringstream是C++中安全灵活的字符串与类型转换工具,支持流式读写、格式控制及错误检查,重用时需str(“”)清空缓冲并clear()重置状态。 std::stringstream 是 C++ 标准库中处理字符串与各种类型之间转换最常用、最安全的工具之一…

    2025年12月19日
    000
  • C++如何实现一个简单的JSON解析器?C++递归下降解析法实战【项目练习】

    用C++11手写轻量级JSON解析器需采用递归下降法,为value、object、array等非终结符实现对应函数,配合JsonValue联合体结构和位置指针pos遍历字符串,正确处理转义、数字解析、空白跳过及错误定位。 用C++手写一个轻量级JSON解析器,核心是递归下降(Recursive De…

    2025年12月19日 好文分享
    000
  • c++如何使用std::string_view_c++高效只读字符串视图

    std::string_view不拥有字符串数据,仅提供对已有字符串的轻量引用,避免不必要的拷贝。1. 可统一处理字符串字面量、std::string、字符数组和子串,构造开销为常量时间。2. 必须确保底层字符串生命周期长于视图,否则导致悬空引用。3. 支持size()、substr()、find(…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信