克隆带有对象和基元的 js 数组

clone js array w/ objects and primitives

给定数组:

['1', {type:'2'}, ['3', {number: '4'}], '5']

我需要使用 slicejson.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,但预计会使用多种方法。