用js写一个深度copy的工具方法,入参可能是数组可能是object
时间: 2024-03-10 20:48:14 浏览: 102
好的,以下是一个使用递归实现的深度拷贝函数:
```javascript
function deepCopy(obj) {
// 如果是数组,则创建一个新数组
if (Array.isArray(obj)) {
return obj.map(deepCopy);
}
// 如果是对象,则创建一个新对象
else if (typeof obj === 'object' && obj !== null) {
const newObj = {};
for (let key in obj) {
newObj[key] = deepCopy(obj[key]);
}
return newObj;
}
// 如果是基本类型,则直接返回
else {
return obj;
}
}
```
这个函数首先检查入参是数组还是对象,如果是数组则遍历数组并递归调用 `deepCopy` 函数,如果是对象则遍历对象的属性并递归调用 `deepCopy` 函数。如果是基本类型则直接返回。这样就可以实现一个深度拷贝的工具方法了。
相关问题
js如何深度copy两个数组
在JavaScript中,深度复制数组通常涉及到对嵌套数据结构的处理。有几种常见的方法可以实现深度复制:
1. **使用JSON.parse()和JSON.stringify()**: 这种方法适用于简单数组和非函数、日期等复杂类型的值。首先将数组转换成JSON字符串,然后再解析回来。
```javascript
function deepCopyArray(arr) {
return JSON.parse(JSON.stringify(arr));
}
```
**注意**:这种方法不能复制函数、RegExp对象或undefined。
2. **递归遍历数组**: 使用`for...of`循环,并为每个元素创建一个新的副本,如果是对象,则继续递归。
```javascript
function deepCopyArray(arr) {
let result = [];
for (let item of arr) {
if (Array.isArray(item)) {
result.push(deepCopyArray(item)); // 对于数组也做深拷贝
} else if (typeof item === 'object') {
result.push(Object.assign({}, item)); // 对象浅拷贝,需进一步递归检查属性
} else {
result.push(item);
}
}
return result;
}
```
3. **利用lodash库**: 如果项目依赖了lodash库,它提供了一个便捷的深拷贝方法`_.cloneDeep()`。
```javascript
const _ = require('lodash');
function deepCopyArray(arr) {
return _.cloneDeep(arr);
}
```
js alert文字不能复制_关于JavaScript的深度复制&浅度复制
好的,你的第一个问题是关于JavaScript的深度复制和浅度复制。
在JavaScript中,对象和数组是通过引用来传递的。这意味着当你将一个对象或数组赋值给另一个变量时,它们实际上是指向同一个对象或数组的引用。如果你修改其中一个,另一个也会受到影响。
为了避免这种情况,我们需要进行深度复制或浅度复制。浅度复制只会复制对象或数组的引用,而深度复制会复制整个对象或数组,包括嵌套的对象或数组。
在JavaScript中,浅度复制可以通过Object.assign()方法或spread操作符来完成。例如:
```
const obj1 = { name: 'John', age: 30 };
const obj2 = Object.assign({}, obj1);
// or
const obj3 = { ...obj1 };
```
这将创建一个新的对象,其中包含与原始对象相同的属性和值。但是,如果原始对象包含嵌套的对象或数组,它们将仍然是通过引用传递的。
深度复制可以通过递归遍历对象或数组来完成。例如:
```
function deepCopy(obj) {
let copy;
// Handle the 3 simple types, and null or undefined
if (null == obj || "object" != typeof obj) return obj;
// Handle Date
if (obj instanceof Date) {
copy = new Date();
copy.setTime(obj.getTime());
return copy;
}
// Handle Array
if (obj instanceof Array) {
copy = [];
for (let i = 0, len = obj.length; i < len; i++) {
copy[i] = deepCopy(obj[i]);
}
return copy;
}
// Handle Object
if (obj instanceof Object) {
copy = {};
for (let attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = deepCopy(obj[attr]);
}
return copy;
}
throw new Error("Unable to copy obj! Its type isn't supported.");
}
```
这将递归遍历对象或数组,并复制它们及其嵌套的对象或数组。但是,这可能会影响性能,特别是在处理非常大的对象或数组时。
阅读全文