клон массива js с объектами и примитивами - PullRequest
0 голосов
/ 03 ноября 2018

Учитывая массив:

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

}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Вот простая реализация без методов 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);

Обратите внимание, что это работает только для простых типов данных. Как только вы начнете работать с датами, регулярными выражениями, наборами, картами и т. Д., Вам понадобится гораздо больше логики. Также подумайте о собственных ссылках и функциях и о том, как с ними следует обращаться.

Подробнее о клонировании см. Как выполнить глубокое клонирование в JavaScript , но ожидайте использования нескольких методов.

0 голосов
/ 03 ноября 2018

Вы можете проверить, предоставлен ли объект, и если да, то для массива сделана еще одна проверка. Затем вернитесь либо клонированный массив или объект, либо само значение.

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