给出数组:
['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]}
}
答案 0 :(得分:0)
您可以检查是否提供了对象,如果提供了,则对数组进行另一次检查。然后删除克隆的数组或对象,或者值本身。
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));
答案 1 :(得分:0)
这是没有Array方法的简单实现:
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,但希望使用几种方法。