JavaScript
1'use strict';
24
5var getObjectValues = (function (keys, mapfn) {
6 return function getObjectValues (object) {
7 return keys(object).map(mapfn, object);
8 };
9}(Object.keys, function mapfn (key) {
10 return this[key];
11}));
12
13var mergeObjects1 = (function (assign, getObjectValues) {
14 function reducefn (previous, current) {
15 return assign(previous, current);
16 }
17
18 return function mergeObjects1 (target) {
19 var array = [],
20 i = 0,
21 l = arguments.length;
22
23 while (i < l) {
24 array = array.concat(getObjectValues(arguments[i++]));
25 }
26
27 return array.reduce(reducefn);
28 }
29}(Object.assign, getObjectValues));
30
31var mergeObjects2 = (function (assign, getObjectValues) {
32 return function mergeObjects2 (target) {
33 var array = [],
34 i = 0,
35 l = arguments.length;
36
37 while (i < l) {
38 array = array.concat(getObjectValues(arguments[i++]));
39 }
40
41 return assign.apply(null, array);
42 };
43}(Object.assign, getObjectValues));
44
45var a = {model_name: {id : 1 , name : 'なまえ'}, model_name2: {address: 'tokyo'}};
46var b = {model_name: {id : 2 , tel : 11111}, model_name2: {zip: 5555}};
47
48console.log(JSON.stringify(mergeObjects1(a, b))); // {"id":2,"name":"なまえ","address":"tokyo","tel":11111,"zip":5555}
49console.log(JSON.stringify(mergeObjects2(a, b))); // {"id":2,"name":"なまえ","address":"tokyo","tel":11111,"zip":5555}
(2015/12/05 23:48追記)
Object.assign.apply 版コードを追加し、可変長引数にしました。
Re: Natade_Gorilla さん