回答編集履歴
4
オブジェクト初期化子 \+ Object\.entries \(ES8\)
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コードを三項演算子を使ったコードに修正
test
CHANGED
@@ -134,15 +134,7 @@
|
|
134
134
|
|
135
135
|
|
136
136
|
|
137
|
-
if (map.has(name)) {
|
138
|
-
|
139
|
-
|
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:
|
165
|
+
- 2016/12/28 00:32 new Mapコードを三項演算子を使ったコードに修正
|
172
166
|
|
173
167
|
|
174
168
|
|
2
Map#forEach を使ったコードに修正
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
|
-
|
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
|
-
}, ne
|
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修正
test
CHANGED
File without changes
|