JS对象转JSON时如何排除方法,解析JSON时恢复对应函数?
JS对象序列化排除函数、反序列化恢复函数的最优方案
原代码问题说明
JSON.stringify默认会将函数序列化为null,你现有ReplaceNull逻辑只处理了null值过滤,没有跳过函数,导致数组内的函数会被序列化为null存入存档- 加载时用存档数据直接浅覆盖原G对象,导致原G中定义的函数被存档里的
null值覆盖丢失
方案一:固定结构场景优先用「默认结构+深合并」(适配你游戏存档的场景)
绝大多数游戏存档的对象结构是固定的,函数的位置、数量都是预设的,用这个方案最简洁,不需要额外处理序列化/反序列化的转换逻辑。
步骤1:优化序列化replacer,跳过函数
G.ReplaceNull = function (key, value) { // 直接跳过函数,不参与序列化 if (typeof value === 'function') return undefined // 保留原有过滤null的逻辑 if (value == null) return undefined return value }
步骤2:预定义带所有函数的默认结构
所有需要保留的函数、嵌套对象、数组结构都提前在默认配置里定义好:
const DEFAULT_G = { functionList: [ () => console.log("do something"), // 其他预设函数按数组顺序排列即可 ], ReplaceNull: G.ReplaceNull, // 其他顶层函数、嵌套对象的函数都在这里提前定义 // 比如 nestedObj: { funcA: () => {} } }
步骤3:修改加载逻辑,用深合并保留默认函数
不要用浅展开,浅展开会直接覆盖整个嵌套数组/对象,写一个简易深合并函数,只覆盖存档里的纯数据字段,保留默认结构里的函数:
// 深合并工具:只覆盖非空、非函数的纯数据字段 function deepMerge(target, source) { for (const key in source) { if (!source.hasOwnProperty(key)) continue // 跳过空值、函数,保留目标对象的原有值 if (source[key] == null || typeof source[key] === 'function') continue // 嵌套对象/数组递归合并 if (typeof source[key] === 'object' && target[key] && typeof target[key] === 'object') { deepMerge(target[key], source[key]) } else { // 普通数据类型直接覆盖 target[key] = source[key] } } return target } // 加载逻辑修改 const loadData = JSON.parse(window.localStorage.getItem("slotAuto")) || {} // 先以默认带函数的结构为基础,再合并存档数据 G = deepMerge({...DEFAULT_G}, loadData)
方案二:适配函数动态变化的场景
如果你的函数列表是动态增删、位置不固定的,可以通过「函数映射表+序列化/反序列化转换器」实现:
// 提前定义所有可能用到的函数映射表 const FUNC_MAP = { logSomething: () => console.log("do something"), otherFunc: () => console.log("其他函数") } // 序列化时把函数转成映射表的key G.ReplaceNull = function (key, value) { if (typeof value === 'function') { return Object.keys(FUNC_MAP).find(k => FUNC_MAP[k] === value) || undefined } if (value == null) return undefined return value } // 反序列化时把key转回对应的函数 const loadData = JSON.parse(window.localStorage.getItem("slotAuto"), (key, value) => { if (typeof value === 'string' && FUNC_MAP[value]) return FUNC_MAP[value] return value })
内容的提问来源于stack exchange,提问作者EpicPuppy613
相关产品推荐
相关产品推荐

