Advertisement
Guest User

Task clone/merge objects

a guest
Dec 6th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // 1. Реализовать функцию clone, которая позволяет копировать объекты, содержащие примитивные значения. Пример работы: Пример работы:
  2.  
  3. //через JSON.parse
  4. function clone(obj) {
  5.     var result = JSON.parse(JSON.stringify(obj));
  6.     return result;
  7. }
  8.  
  9.  
  10. //через рекурсию
  11. function clone(obj) {
  12.     if ( obj === null || typeof obj !== 'object' ) {
  13.         return obj;
  14.     }
  15.  
  16.     var result = {};
  17.  
  18.     for (var key in obj) {
  19.         result[key] = clone(obj[key]);
  20.     }
  21.  
  22.     return result;
  23. }
  24.  
  25. //для проверки
  26. var obj1 = {
  27.     a: 10,
  28.     b: 20
  29. };
  30.  
  31. var obj2 = clone(obj1);
  32.  
  33. obj1.a = 15;
  34. console.log(obj2.a); // 10
  35. obj2.b = 25;
  36. console.log(obj1.b); // 20
  37.  
  38. // 2. Улучшить функцию clone таким образом, чтобы кроме примитивных значений она могла копировать вложенные значения,
  39. // включая объекты, массивы, даты.
  40. function clone(obj) {
  41.     if ( obj === null || typeof obj !== 'object' ) {
  42.         return obj;
  43.     }
  44.  
  45.     var result = {};
  46.  
  47.     for (var key in obj) {
  48.         result[key] = clone(obj[key]);
  49.     }
  50.  
  51.     return result;
  52. }
  53.  
  54. //для проверки
  55. var obj1 = {
  56.     a: 10,
  57.     b: 20,
  58.     c: {
  59.         item1: 'title',
  60.         nestedObj: {
  61.             x: 50,
  62.             y: 60
  63.     }
  64.     },
  65.     arr: [1,2,3]
  66. };
  67. var obj2 = clone(obj1);
  68. obj2.arr.push(4);
  69. console.log(obj2.arr, obj1.arr);
  70. obj1.c.item1 = 'titleChanged';
  71. obj1.c.nestedObj.x = 90;
  72. console.log(obj1.c.item1, obj2.c.item1);
  73. console.log(obj1.c.nestedObj.x, obj1.c.nestedObj.y, obj2.c.nestedObj.x, obj2.c.nestedObj.y);
  74.  
  75.  
  76. // 3. Реализовать функцию merge(destination, source), которая записывает значения из объекта source в объект destination.
  77. // Функция поддерживает глубокое копирование, для этого можно воспользоваться реализованной выше функцией clone.
  78.  
  79. function merge(destination, source) {
  80.     for (var key in source) {
  81.         if (source.hasOwnProperty(key)) {
  82.         destination[key] = source[key];
  83.         }
  84.     }
  85.     return destination;
  86. }
  87.  
  88. merge(destination, source);
  89. console.log(destination.a, destination.b.item1, destination.c);
  90. source.b.item1 = 'window';
  91. console.log(destination.b.item1);
  92.  
  93. //Можно и с clone
  94. var source = {
  95.     a: 10,
  96.     b: {
  97.         item1: 'title'
  98.     }
  99. };
  100. var destination = {
  101.     a: 20,
  102.     b: {
  103.         item1: 'panel'
  104.     },
  105.     c: true
  106. };
  107.  
  108. //clone
  109. function clone(obj) {
  110.     if ( obj === null || typeof obj !== 'object' ) {
  111.         return obj;
  112.     }
  113.  
  114.     var result = obj.constructor();
  115.  
  116.     for (var key in obj) {
  117.         result[key] = clone(obj[key]);
  118.     }
  119.  
  120.     return result;
  121. }
  122.  
  123. //merge
  124. function merge(destination, source) {
  125.     var result = clone(source);
  126.  
  127.     for (var key in result) {
  128.         if (result.hasOwnProperty(key)) {
  129.         destination[key] = result[key];
  130.         }
  131.     }
  132.     return destination;
  133. }
  134.  
  135.  
  136. //для проверки
  137. merge(destination, source);
  138. console.log(destination.a, destination.b.item1, destination.c);
  139. source.b.item1 = 'window';
  140. console.log(destination.b.item1);
  141.  
  142. // 4. Реализовать функцию mergeIf(destination, source), которая записывает значения из объекта source в объект destination
  143. // только в том случае, если в destination отсутствует такое свойство.
  144. var source = {
  145.     a: 10,
  146.     b: {
  147.         item1: 'title'
  148.     },
  149.     c: false
  150. };
  151. var destination = {
  152.     c: true
  153. };
  154.  
  155. function merge(destination, source) {
  156.     for (var key in source) {
  157.         if (!source.hasOwnProperty(key)) {
  158.         destination[key] = source[key];
  159.         }
  160.     }
  161.     return destination;
  162. }
  163.  
  164. //для проверки
  165. mergeIf(destination, source);
  166. console.log(destination.a, destination.b.item1, destination.c); // 10, 'title', true
  167.  
  168. // 5. Улучшить функцию merge(destination [, source1, source2 ... sourceN]), таким образом, чтобы вместо второго аргумента
  169. // source она могла принимать 1 и более source-объектов.
  170.  
  171. var source1 = {
  172.     a: 10,
  173.     b: {
  174.         item1: 'title'
  175.     },
  176.     c: false
  177. };
  178. var source2 = {
  179.     b: [1,2,3],
  180.     c: true
  181. };
  182. var destination = {};
  183.  
  184. //merge
  185. function merge(destination) {
  186.  
  187.     for (var i = 1; i < arguments.length; i++) {
  188.         var arg = arguments[i];
  189.         for (var key in arg) {
  190.             destination[key] = arg[key];
  191.         }
  192.     }
  193.     return destination;
  194. }
  195.  
  196. //для проверки
  197. merge(destination, source1, source2);
  198. console.log(destination.a, destination.b, destination.c);
  199. source2.b.push(4);
  200. source1.a = 50;
  201. console.log(destination.a, destination.b, destination.c);
  202. console.log(source1.a, source2.b);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement