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

序列化时如何替换JavaScript对象中指定类型对象为自定义字符串

序列化JavaScript对象时按类型替换嵌套元素的问题

我有一组类似如下的JavaScript对象:

let query:any = [
  {$match:{taskId: new ObjectId("62f0efaf451f8c1f678a29e9")}},
  {$match:{$or:[{fieldName1:new Date()}, {fieldName2:new Date("2022-08-08T11:12:47.198Z")}]}}
]

注:字段名和查询结构不固定,可能包含对象与数组的多种嵌套组合。

我需要将其序列化,把Date对象和MongoDB ObjectId对象替换为自定义字符串。尝试使用JSON.stringify的replacer函数,以下是仅替换Date对象的代码:

var query = [
  {$match:{$or:[{fieldName1:new Date()}, {fieldName2:new Date("2022-08-08T11:12:47.198Z")}]}}
]

function customBodyEncoder(key, value) {
  console.log("value:", value)
  console.log("type: ", typeof(value))
  console.log("-------------------")
  if (value instanceof Date) {
    return `#new_date_${String(value)}`
  }
  return value
}

let queryString = JSON.stringify(query, customBodyEncoder)
console.log(queryString)

实际输出字符串:
[{"$match":{"taskId":"62f0efaf451f8c1f678a29e9"}},{"$match":{"$or":[{"fieldName1":"2022-08-16T18:23:00.014Z"},{"fieldName2":"2022-08-08T11:12:47.198Z"}]}}]

我需要按类型匹配并替换元素,但replacer似乎拿到的是已转为字符串的元素,无法得到预期输出:
[{"$match":{"taskId":"62f0efaf451f8c1f678a29e9"}},{"$match":{"$or":[{"fieldName1":"#new_date_2022-08-16T18:10:15.015Z"},{"fieldName2":"#new_date_2022-08-08T11:12:47.198Z"}]}}]

请问序列化时,是否有办法按类型替换JavaScript对象中任意位置的元素?


编辑:我的需求是序列化JS对象时保留(编码和解码)Date对象和MongoDB ObjectId,最终通过EJSON实现了该需求。


内容的提问来源于stack exchange,提问作者Isuru J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:45:48