Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.03.2016, 22:04
Новичок на форуме
Отправить личное сообщение для olegyakovlev Посмотреть профиль Найти все сообщения от olegyakovlev
 
Регистрация: 28.03.2016
Сообщений: 2

Клонирование объекта
Необходимо на typescript сделать метод для клонирования объекта. С учетом того, что элементы могут быть ссылкой на этот же объект

Код:
var obj: any = {
  x:{y: 'qwe'},
    y: "qwe"
};
obj['x']['a'] = obj;
obj['x']['b'] = obj['x'];
при "стандартном" методе не выйдет с рекурсии
Код:
function cloneObject(obj) {
    var clone = {};
    for (var i in obj) {
        if (typeof (obj[i]) == "object" && obj[i] != null) clone[i] = cloneObject(obj[i]);
       else clone[i] = obj[i];
    }
    return clone;
}
Как можно обойти такой вариант?
Ответить с цитированием
  #2 (permalink)  
Старый 29.03.2016, 00:21
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

olegyakovlev, писать свой велосипед. Например, можете использовать мой рекурсивный итератор и взять за основу пример из книги рецептов (Deep copy / Deep clone).
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 29.03.2016, 00:21
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

var cloneObject = (function(global) {

    function ObjMap() {
        this._data = [];
    }
    ObjMap.prototype = {
        constructor: ObjMap,
        _get: function(key) {
            for (var i = 0; i < this._data.length; ++i) {
                if (this._data[i].key === key) {
                    return this._data[i];
                }
            }
            return null;
        },
        get: function(key) {
            var data = this._get(key);
            return data ? data.value : void(0);
        },
        set: function(key, value) {
            var data = this._get(key);
            if (data) {
                data.value = value;
            } else {
                this._data.push({ key: key, value: value });
            }
        }
    };
    
    function cloneObject(obj, map) {
        var clone = map.get(obj);
        if (clone) {
            return clone;
        }
        clone = {};
        map.set(obj, clone);
        for (var i in obj) {
            if (obj.hasOwnProperty(i)) {
                if (obj[i] && typeof obj[i] == "object") {
                    clone[i] = cloneObject(obj[i], map);
                } else {
                    clone[i] = obj[i];
                }
            }
        }
        return clone;
    }
    
    return function(obj) {
        var map = global.Map ? new Map() : new ObjMap();
        return cloneObject(obj, map);
    };
})(window);
Ответить с цитированием
  #4 (permalink)  
Старый 29.03.2016, 00:24
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

ещё надо добавить поддержку массивов, и возможно некоторых специальных объектов (функции, регексы и т.д.), но к циклам это не относится и в мой код не вошло, дабы не загромождать )
Ответить с цитированием
  #5 (permalink)  
Старый 30.03.2016, 10:33
Новичок на форуме
Отправить личное сообщение для olegyakovlev Посмотреть профиль Найти все сообщения от olegyakovlev
 
Регистрация: 28.03.2016
Сообщений: 2

Спасибо.
пока сделано следующее решение:
Код:
class NewObj {

arrOriginObj:Object[]=[];
arrNewObj:Object[]=[];

clone(objP:Object){

 for(let i=0; i< this.arrOriginObj.length;i++){
   if(objP===this.arrOriginObj[i])
     return this.arrNewObj[i];
  }
 
 let newObj={};
 this.arrNewObj.push(newObj);
 this.arrOriginObj.push(objP);
 
 for(let key in objP){
  if(objP.hasOwnProperty(key)) {
   if(objP[key] !== null && typeof(objP[key]) === "object" ) {
      newObj[key] = this.clone( objP[key] );
    }else 
     newObj[key] = objP[key];   
  }
 }
 return newObj;
}
}
объекты проходит)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клонирование объекта в javascript Casufi Общие вопросы Javascript 1 29.06.2015 01:23
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Клонирование DOM объекта или как вставить один div много раз Jmunb Общие вопросы Javascript 7 04.04.2013 14:58
JQuery. Клонирование объекта Unknown jQuery 1 11.09.2012 23:19
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00