Advertisement
Guest User

Task

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