回答編集履歴

4

オブジェクト初期化子 \+ Object\.entries \(ES8\)

2016/12/27 16:38

投稿

think49
think49

スコア18162

test CHANGED
@@ -106,6 +106,64 @@
106
106
 
107
107
 
108
108
 
109
+ ### オブジェクト初期化子 + Object.entries (ES8)
110
+
111
+
112
+
113
+ 先行仕様(ES8/ES2017)ですが、`Object.entries` を利用するとオブジェクト初期化子のコードを更にエレガントに書けます。
114
+
115
+ `Object.entries` は Polyfill コードがあるので、現行でも使おうと思えば使えます。
116
+
117
+
118
+
119
+ - [19.1.2.17 Object.entries - ECMAScript® 2017 Language Specification](https://tc39.github.io/ecma262/#sec-object.entries)
120
+
121
+ - [Object.entries() - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
122
+
123
+
124
+
125
+ ```JavaScript
126
+
127
+ 'use strict';
128
+
129
+ var src = [{'name':'abc','value':100},{'name':'def','value':50},{'name':'abc','value':123},{'name':'hij','value':789},{'name':'def','value':1}];
130
+
131
+
132
+
133
+ var results = Object.entries(src.reduce((object, current) => {
134
+
135
+ var name = current.name;
136
+
137
+
138
+
139
+ if (object.hasOwnProperty(name)) {
140
+
141
+ object[name] += current.value;
142
+
143
+ } else {
144
+
145
+ object[name] = current.value;
146
+
147
+ }
148
+
149
+
150
+
151
+ return object;
152
+
153
+ }, {})).map(entry=>{
154
+
155
+ return {name: entry[0], value: entry[1]};
156
+
157
+ });
158
+
159
+
160
+
161
+ console.log(JSON.stringify(results)); // [[{"name":"abc","value":223},{"name":"def","value":51},{"name":"hij","value":789}]
162
+
163
+ ```
164
+
165
+
166
+
109
167
  ### new Map (ES6)
110
168
 
111
169
 
@@ -164,6 +222,8 @@
164
222
 
165
223
  - 2016/12/28 00:32 new Mapコードを三項演算子を使ったコードに修正
166
224
 
225
+ - 2016/12/28 01:38 オブジェクト初期化子 + Object.entriesのコード追記
226
+
167
227
 
168
228
 
169
229
  Re: stakezaki さん

3

new Mapコードを三項演算子を使ったコードに修正

2016/12/27 16:38

投稿

think49
think49

スコア18162

test CHANGED
@@ -134,15 +134,7 @@
134
134
 
135
135
 
136
136
 
137
- if (map.has(name)) {
138
-
139
- map.set(name, map.get(name) + current.value);
137
+ map.set(name, map.has(name) ? map.get(name) + current.value : current.value);
140
-
141
- } else {
142
-
143
- map.set(name, current.value);
144
-
145
- }
146
138
 
147
139
 
148
140
 
@@ -168,7 +160,9 @@
168
160
 
169
161
 
170
162
 
163
+ - 2016/12/28 00:08 new Mapコードを Object.keys -> Map#forEach
164
+
171
- - 2016/12/28 00:08 ES6版を Map#forEach を使ったコードに修正
165
+ - 2016/12/28 00:32 new Mapコード三項演算子を使ったコードに修正
172
166
 
173
167
 
174
168
 

2

Map#forEach を使ったコードに修正

2016/12/27 15:32

投稿

think49
think49

スコア18162

test CHANGED
@@ -120,11 +120,15 @@
120
120
 
121
121
  'use strict';
122
122
 
123
- var src = [{'name':'abc','value':100},{'name':'def','value':50},{'name':'abc','value':123},{'name':'hij','value':789},{'name':'def','value':1}];
123
+ var src = [{'name':'abc','value':100},{'name':'def','value':50},{'name':'abc','value':123},{'name':'hij','value':789},{'name':'def','value':1}],
124
+
125
+ map = new Map,
126
+
127
+ results = [];
124
128
 
125
129
 
126
130
 
127
- var map = src.reduce(function (map, current) {
131
+ src.reduce(function (map, current) {
128
132
 
129
133
  var name = current.name;
130
134
 
@@ -144,15 +148,11 @@
144
148
 
145
149
  return map;
146
150
 
147
- }, new Map);
151
+ }, map).forEach(function (value, key, map) {
148
152
 
153
+ this.push({name: key, value: value});
149
154
 
150
-
151
- var results = [...map.entries()].map(function (entry) {
152
-
153
- return {name: entry[0], value: entry[1]};
154
-
155
- });
155
+ }, results);
156
156
 
157
157
 
158
158
 
@@ -164,4 +164,12 @@
164
164
 
165
165
 
166
166
 
167
+ ### 更新履歴
168
+
169
+
170
+
171
+ - 2016/12/28 00:08 ES6版を Map#forEach を使ったコードに修正
172
+
173
+
174
+
167
175
  Re: stakezaki さん

1

typo修正

2016/12/27 15:08

投稿

think49
think49

スコア18162

test CHANGED
File without changes