深度优先思想实现拷贝函数可以采用递归的方式遍历对象或数组,对每个元素进行复制。如果当前元素是一个对象或数组,则递归调用拷贝函数,如果是基本数据类型则直接进行复制。以下是一个用深度优先思想实现拷贝函数的示例代码:
function deepClone(obj) {
// 如果obj是基本数据类型或null,则直接返回
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let result;
// 判断obj是数组还是对象
if (Array.isArray(obj)) {
result = [];
} else {
result = {};
}
// 递归遍历obj的每个属性或元素,并进行拷贝
for (let key in obj) {
result[key] = deepClone(obj[key]);
}
return result;
}
广度优先思想实现拷贝函数可以使用队列的方式,将每个元素放入队列中,然后循环遍历队列。如果当前元素是一个对象或数组,则将其属性或元素放入队列中,然后继续循环遍历队列。如果是基本数据类型则直接进行复制。以下是一个用广度优先思想实现拷贝函数的示例代码:
function breadthClone(obj) {
// 如果obj是基本数据类型或null,则直接返回
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let result;
// 判断obj是数组还是对象
if (Array.isArray(obj)) {
result = [];
} else {
result = {};
}
let queue = [obj];
let resQueue = [result];
// 循环遍历队列
while (queue.length > 0) {
let curObj = queue.shift();
let curRes = resQueue.shift();
// 遍历当前元素的每个属性或元素,并进行拷贝
for (let key in curObj) {
let val = curObj[key];
if (typeof val === 'object' && val !== null) {
// 如果当前属性或元素是一个对象或数组,则将其放入队列中
let newVal = Array.isArray(val) ? [] : {};
curRes[key] = newVal;
queue.push(val);
resQueue.push(newVal);
} else {
// 如果是基本数据类型则直接进行复制
curRes[key] = val;
}
}
}
return result;
}