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

时间:2018-11-03 16:53:27

标签: javascript arrays duplicates clone

给出数组:

['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]}

}

2 个答案:

答案 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,但希望使用几种方法。