克隆带有对象和基元的 js 数组
clone js array w/ objects and primitives
给定数组:
['1', {type:'2'}, ['3', {number: '4'}], '5']
我需要使用 slice
、json.parse
和其他方法制作一个没有 的克隆 。
目前,代码可以运行,但不会克隆对象:
var myArr =['1',{type:'2'},['3',{number:'4'}],'5'];
var arrClone=[];
for(var i=0;i<myArr.length;i++){
if(typeof(myArr[i])==='object')
{
var arr=[];
for(var j=0;j<myArr[i].length;j++){
arr[j]=myArr[i][j];
}
arrClone[i]=arr;
}else { arrClone[i]=myArr[i]}
}
您可以检查是否提供了对象,如果提供了,则对数组进行另一次检查。然后返回克隆的数组或对象,或值本身。
function getClone(value) {
if (value && typeof value === 'object') {
return Array.isArray(value)
? value.map(getClone)
: Object.assign(
...Object.entries(value).map(([k, v]) => ({ [k]: getClone(v) }))
);
}
return value;
}
var data = ['1', { type: '2' }, ['3', { number: '4' }], '5'],
clone = getClone(data);
console.log(getClone(data));
这是一个没有数组方法的简单实现:
function deepClone(obj) {
if (typeof obj !== "object" || obj === null) return obj; // primitives
// It could be an array or plain object
const result = obj.constructor.name == "Array" ? [] : {};
for (const key in obj) {
result[key] = deepClone(obj[key]); // recursive call
}
return result;
}
// Demo
var myArr =['1',{type:'2'},['3',{number:'4'}],'5'];
var arrClone = deepClone(myArr);
console.log(arrClone);
请注意,这仅适用于简单数据类型。一旦您开始使用日期、正则表达式对象、集合、地图等,您就需要更多的逻辑。还要考虑自引用和函数,以及应该如何处理它们。
有关更高级的克隆,请参阅 How to Deep Clone in JavaScript,但预计会使用多种方法。
给定数组:
['1', {type:'2'}, ['3', {number: '4'}], '5']
我需要使用 slice
、json.parse
和其他方法制作一个没有 的克隆 。
目前,代码可以运行,但不会克隆对象:
var myArr =['1',{type:'2'},['3',{number:'4'}],'5'];
var arrClone=[];
for(var i=0;i<myArr.length;i++){
if(typeof(myArr[i])==='object')
{
var arr=[];
for(var j=0;j<myArr[i].length;j++){
arr[j]=myArr[i][j];
}
arrClone[i]=arr;
}else { arrClone[i]=myArr[i]}
}
您可以检查是否提供了对象,如果提供了,则对数组进行另一次检查。然后返回克隆的数组或对象,或值本身。
function getClone(value) {
if (value && typeof value === 'object') {
return Array.isArray(value)
? value.map(getClone)
: Object.assign(
...Object.entries(value).map(([k, v]) => ({ [k]: getClone(v) }))
);
}
return value;
}
var data = ['1', { type: '2' }, ['3', { number: '4' }], '5'],
clone = getClone(data);
console.log(getClone(data));
这是一个没有数组方法的简单实现:
function deepClone(obj) {
if (typeof obj !== "object" || obj === null) return obj; // primitives
// It could be an array or plain object
const result = obj.constructor.name == "Array" ? [] : {};
for (const key in obj) {
result[key] = deepClone(obj[key]); // recursive call
}
return result;
}
// Demo
var myArr =['1',{type:'2'},['3',{number:'4'}],'5'];
var arrClone = deepClone(myArr);
console.log(arrClone);
请注意,这仅适用于简单数据类型。一旦您开始使用日期、正则表达式对象、集合、地图等,您就需要更多的逻辑。还要考虑自引用和函数,以及应该如何处理它们。
有关更高级的克隆,请参阅 How to Deep Clone in JavaScript,但预计会使用多种方法。