广度优先思想实现一个拷贝函数

深拷贝

代码展示

let BFSdeepClone = (obj) => {
	let origin = [obj],
		copyObj = {},
		copy = [copyObj] //去除环状数据
	let visitedQueue = [],
		visitedCopyQueue = []
	while (origin.length > 0) {
		let items = origin.shift(),
			_obj = copy.shift()
		visitedQueue.push(items)
		if (isTypeOf(items, 'object') || isTypeOf(items, 'array')) {
			for (let item in items) {
				let val = items[item]
				if (isTypeOf(val, 'object')) {
					let index = visitedQueue.indexOf(val)
					if (!~index) {
						_obj[item] = {} //下次while循环使用给空对象提供数据
						origin.push(val) //推入引用对象
						copy.push(_obj[item])
					} else {
						_obj[item] = visitedCopyQueue[index]
						visitedQueue.push(_obj)
					}
				} else if (isTypeOf(val, 'array')) { //数组类型在这里创建了一个空数组
					_obj[item] = []
					origin.push(val)
					copy.push(_obj[item])
				} else if (isTypeOf(val, 'function')) {
					_obj[item] = eval('(' + val.toString() + ')');
				} else {
					_obj[item] = val
				}
			} //将已经处理过的对象数据推入数组给环状数据使用
			visitedCopyQueue.push(_obj)
		} else if (isTypeOf(items, 'function')) {
			copyObj = eval('(' + items.toString() + ')');
		} else {
			copyObj = obj
		}
	}
	return copyObj
}

写点测试代码,验证一下

let newObj = BFSdeepClone(obj);
console.log(newObj)
newObj.a = 99;
console.log(newObj, obj);

验证结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值