You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS对象转JSON时如何排除方法,解析JSON时恢复对应函数?

JS对象序列化排除函数、反序列化恢复函数的最优方案

原代码问题说明

  1. JSON.stringify 默认会将函数序列化为 null,你现有 ReplaceNull 逻辑只处理了 null 值过滤,没有跳过函数,导致数组内的函数会被序列化为 null 存入存档
  2. 加载时用存档数据直接浅覆盖原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:54:03