【问题标题】:clone js array w/ objects and primitives克隆带有对象和原语的 js 数组
【发布时间】:2019-04-07 13:53:42
【问题描述】:

给定数组:

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

}

【问题讨论】:

  • 像这样克隆:let clone = JSON.parse(JSON.stringify(['1',{type:'2'},['3',{number:'4'}],'5']))
  • 如果不使用 slice 或 json.parse 或“其他方法”,我认为没有充分的理由这样做,除非它是家庭作业。祝你好运!
  • 其他方法是什么意思?如何判断对象是否为数组?
  • 是否有任何答案适合您的需求?你能发表评论吗?

标签: javascript arrays duplicates clone


【解决方案1】:

您可以检查是否提供了对象,如果提供,则对数组进行另一次检查。然后 retrn 克隆的数组或对象,或值本身。

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));

【讨论】:

    【解决方案2】:

    这是一个没有 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,但预计会使用多种方法。

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2021-06-30
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2016-01-21
      • 2018-03-31
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多