Skip to content

Instantly share code, notes, and snippets.

@liutianpeng
Created May 25, 2022 10:54
Show Gist options
  • Save liutianpeng/7edbb12f04b349d0b10764d7c025296a to your computer and use it in GitHub Desktop.
Save liutianpeng/7edbb12f04b349d0b10764d7c025296a to your computer and use it in GitHub Desktop.
Dump/Parse 浏览器内存
//用obj对象生成JSON
let Dump = function(obj) {
let __A__=[]
let __N__ = 0
console.log(">>>>>>>>>>>")
//把Function转换成Object便于生成JSON
{
let _CONVERT_ = {}
let convFunc = (obj)=>{
if (obj==null){return null}
if (typeof obj != "function"){return obj}
if (_CONVERT_[obj]) {return _CONVERT_[obj]}
let ret = {}
_CONVERT_[obj] = ret
for (var k in obj){
if(Object.prototype.hasOwnProperty.call(obj, k)){
ret[k] = obj[k]
}
}
return ret
}
let _CHANGE_LIST_ = []
let _CHANGE_INDEX_ = 0
let _CHANGE_ = {}
let FuncToObj = function(obj, deep=0){
if (obj==null){return null}
if (deep==0) {return obj}
if (typeof obj != "object"){return obj}
if (_CHANGE_LIST_.includes(obj)){return _CHANGE_[obj["__json_id__"]]}
let src = {}
obj["__json_id__"] = _CHANGE_INDEX_
_CHANGE_[_CHANGE_INDEX_]=src
_CHANGE_INDEX_++
for (var k in obj){
if(Object.prototype.hasOwnProperty.call(obj, k)){
src[k] = FuncToObj(convFunc(obj[k]), deep-1)
}
}
return src
}
obj = FuncToObj(obj, 1)
_CHANGE_LIST_.forEach((val)=>{
if (val["__json_id__"]){
delete val["__json_id__"]
}
})
}
//处理了循环引用的JSON
let str= JSON.stringify(obj, (k, v) => {
// if (k==""){return v}
if (v==null){return null}
// if (k=="__A__"){return undefined}
// if (k=="__S__"){return undefined}
// if (k=="__N__"){return undefined}
// if (k=="__json_stop__"){return undefined}
if (typeof v == "object"){
if (v["__json_stop__"]){return undefined}
if (__A__.includes(v)) {
return {__json_id__:v["__json_id__"], __json_stop__:true}
}
__N__++
v["__json_id__"] = __N__
__A__.push(v)
return v
}else{
return v
}
})
//清理生成JSON的时候加的标记
__A__.forEach((val)=>{
if (val["__json_id__"]){
delete val["__json_id__"]
}
})
return str
}
//把JSON反序列化成Object
let Parse = function(str) {
let dict = {}
//反序列化JSON并标记引用
let ret = JSON.parse(str, (k, v) => {
// console.log("k",k)
// console.log("v",v)
if (v==null){return v}
if (typeof v == "object"){
if (v["__json_stop__"]){return v}
dict[v["__json_id__"]]=v
}
return v
})
//重建引用
let reIndex = (obj)=>{
if (!!!obj){return}
if (typeof obj != "object"){return}
for (var k in obj){
if(Object.prototype.hasOwnProperty.call(obj, k)){
if (typeof obj[k] == "object" && obj[k]!=null){
if (obj[k]["__json_stop__"]){
obj[k] = dict[obj[k]["__json_id__"]]
}else{
reIndex(obj[k])
}
}
}
}
}
reIndex(ret)
//清理生成JSON的时候加的标记
for (var k in dict){
if(Object.prototype.hasOwnProperty.call(dict, k)){
delete dict[k]["__json_id__"]
}
}
return ret
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment