蹦床函数实现深度递归的深拷贝;递归改循环,避免栈溢出
1、先写蹦床函数——可以将递归转为循环执行
点击查看代码
//蹦床函数
function toc(func) {
let argsArr = [];
let active = false;
return function () {
argsArr.push(arguments)
if (!active) {
active = true
while (argsArr.length) {
func.apply(this,argsArr.shift())
}
active = false
}
}
}
2、深拷贝的业务逻辑
——这里比较难写,因为需要把数据都当参数拿出来,不能使用内部变量,否则有与上一执行栈环境有牵连,就会导致闭包存在
——我这里只是处理了对象数据和
点击查看代码
let deep = toc( function (obj = {}, level = 0, target = {}, curkeys = []) {
let s = 'target'
for(let v of curkeys){
s += `['${v}']`
}
for (let key in obj) {
s += '[key] = '
if (['[object Array]', '[object Object]'].includes(Object.prototype.toString.call(obj[key]))) {
s += `Object.prototype.toString.call(obj['${key}']) === '[object Object]' ? {} : []`
eval(s)
deep(obj[key], level + 1, target, [...curkeys, key])
} else {
s += `obj['${key}']`
eval(s)
}
// console.log(s)
return target
}
})
3、实际调用
点击查看代码
let target1 = {} // 作为入参传入,即是入参,也是出参
let a = deep({
a: [0, 2, 3, 4, [[[[[[[[1]]]]]], {a:[[2,3,3,3,3,44,5,5,5,5,5,5,,,,]]}]]],
b: {
c: 1,
d: {
s: 222
},
xxx: undefined,
null: null
}
}, 0 , target1)
console.log('最终值:', JSON.stringify(target1))
4、执行结果
本文来自博客园,作者:Math点PI,个性签名:“不写bug怎么进步?”,转载请注明原文链接:https://www.cnblogs.com/MrZhous/p/17043894.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY