Created
May 25, 2022 10:54
-
-
Save liutianpeng/7edbb12f04b349d0b10764d7c025296a to your computer and use it in GitHub Desktop.
Dump/Parse 浏览器内存
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//用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