teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

Object\.assign\.apply 版コードを追加し、可変長引数にしました

2015/12/05 14:50

投稿

think49
think49

スコア18194

answer CHANGED
@@ -11,22 +11,52 @@
11
11
  return this[key];
12
12
  }));
13
13
 
14
- var sample = (function (reducefn) {
14
+ var mergeObjects1 = (function (assign, getObjectValues) {
15
- return function sample (object1, object2) {
15
+ function reducefn (previous, current) {
16
- return getObjectValues(object1).concat(getObjectValues(object2)).reduce(reducefn);
16
+ return assign(previous, current);
17
17
  }
18
- }(function reducefn (previous, current) {
19
- return Object.assign(previous, current);
20
- }));
21
18
 
19
+ return function mergeObjects1 (target) {
20
+ var array = [],
21
+ i = 0,
22
+ l = arguments.length;
23
+
24
+ while (i < l) {
25
+ array = array.concat(getObjectValues(arguments[i++]));
26
+ }
27
+
28
+ return array.reduce(reducefn);
29
+ }
30
+ }(Object.assign, getObjectValues));
31
+
32
+ var mergeObjects2 = (function (assign, getObjectValues) {
33
+ return function mergeObjects2 (target) {
34
+ var array = [],
35
+ i = 0,
36
+ l = arguments.length;
37
+
38
+ while (i < l) {
39
+ array = array.concat(getObjectValues(arguments[i++]));
40
+ }
41
+
42
+ return assign.apply(null, array);
43
+ };
44
+ }(Object.assign, getObjectValues));
45
+
22
46
  var a = {model_name: {id : 1 , name : 'なまえ'}, model_name2: {address: 'tokyo'}};
23
47
  var b = {model_name: {id : 2 , tel : 11111}, model_name2: {zip: 5555}};
24
48
 
25
- console.log(JSON.stringify(sample(a, b))); // {"id":2,"name":"なまえ","address":"tokyo","tel":11111,"zip":5555}
49
+ console.log(JSON.stringify(mergeObjects1(a, b))); // {"id":2,"name":"なまえ","address":"tokyo","tel":11111,"zip":5555}
50
+ console.log(JSON.stringify(mergeObjects2(a, b))); // {"id":2,"name":"なまえ","address":"tokyo","tel":11111,"zip":5555}
26
51
  ```
27
52
 
28
53
  - [Object.values() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values)
29
54
  - [Object.assign() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
30
55
  - [Array.prototype.reduce() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
31
56
 
57
+ ---
58
+ **(2015/12/05 23:48追記)**
59
+
60
+ Object.assign.apply 版コードを追加し、可変長引数にしました。
61
+
32
62
  Re: Natade_Gorilla さん