回答編集履歴
4
オブジェクト初期化子 \+ Object\.entries \(ES8\)
answer
CHANGED
@@ -52,6 +52,35 @@
|
|
52
52
|
console.log(JSON.stringify(results)); // [{"name":"abc","value":223},{"name":"def","value":51},{"name":"hij","value":789}]
|
53
53
|
```
|
54
54
|
|
55
|
+
### オブジェクト初期化子 + Object.entries (ES8)
|
56
|
+
|
57
|
+
先行仕様(ES8/ES2017)ですが、`Object.entries` を利用するとオブジェクト初期化子のコードを更にエレガントに書けます。
|
58
|
+
`Object.entries` は Polyfill コードがあるので、現行でも使おうと思えば使えます。
|
59
|
+
|
60
|
+
- [19.1.2.17 Object.entries - ECMAScript® 2017 Language Specification](https://tc39.github.io/ecma262/#sec-object.entries)
|
61
|
+
- [Object.entries() - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
|
62
|
+
|
63
|
+
```JavaScript
|
64
|
+
'use strict';
|
65
|
+
var src = [{'name':'abc','value':100},{'name':'def','value':50},{'name':'abc','value':123},{'name':'hij','value':789},{'name':'def','value':1}];
|
66
|
+
|
67
|
+
var results = Object.entries(src.reduce((object, current) => {
|
68
|
+
var name = current.name;
|
69
|
+
|
70
|
+
if (object.hasOwnProperty(name)) {
|
71
|
+
object[name] += current.value;
|
72
|
+
} else {
|
73
|
+
object[name] = current.value;
|
74
|
+
}
|
75
|
+
|
76
|
+
return object;
|
77
|
+
}, {})).map(entry=>{
|
78
|
+
return {name: entry[0], value: entry[1]};
|
79
|
+
});
|
80
|
+
|
81
|
+
console.log(JSON.stringify(results)); // [[{"name":"abc","value":223},{"name":"def","value":51},{"name":"hij","value":789}]
|
82
|
+
```
|
83
|
+
|
55
84
|
### new Map (ES6)
|
56
85
|
|
57
86
|
オブジェクト初期化子で「`name` が `String` 型でなければならない」欠点を `new Map` で克服しており、可搬性が最も高いと思われます。
|
@@ -81,5 +110,6 @@
|
|
81
110
|
|
82
111
|
- 2016/12/28 00:08 new Mapコードを Object.keys -> Map#forEach
|
83
112
|
- 2016/12/28 00:32 new Mapコードを三項演算子を使ったコードに修正
|
113
|
+
- 2016/12/28 01:38 オブジェクト初期化子 + Object.entriesのコード追記
|
84
114
|
|
85
115
|
Re: stakezaki さん
|
3
new Mapコードを三項演算子を使ったコードに修正
answer
CHANGED
@@ -66,11 +66,7 @@
|
|
66
66
|
src.reduce(function (map, current) {
|
67
67
|
var name = current.name;
|
68
68
|
|
69
|
-
if (map.has(name)) {
|
70
|
-
|
69
|
+
map.set(name, map.has(name) ? map.get(name) + current.value : current.value);
|
71
|
-
} else {
|
72
|
-
map.set(name, current.value);
|
73
|
-
}
|
74
70
|
|
75
71
|
return map;
|
76
72
|
}, map).forEach(function (value, key, map) {
|
@@ -83,6 +79,7 @@
|
|
83
79
|
|
84
80
|
### 更新履歴
|
85
81
|
|
82
|
+
- 2016/12/28 00:08 new Mapコードを Object.keys -> Map#forEach
|
86
|
-
- 2016/12/28 00:
|
83
|
+
- 2016/12/28 00:32 new Mapコードを三項演算子を使ったコードに修正
|
87
84
|
|
88
85
|
Re: stakezaki さん
|
2
Map#forEach を使ったコードに修正
answer
CHANGED
@@ -59,9 +59,11 @@
|
|
59
59
|
|
60
60
|
```JavaScript
|
61
61
|
'use strict';
|
62
|
-
var src = [{'name':'abc','value':100},{'name':'def','value':50},{'name':'abc','value':123},{'name':'hij','value':789},{'name':'def','value':1}]
|
62
|
+
var src = [{'name':'abc','value':100},{'name':'def','value':50},{'name':'abc','value':123},{'name':'hij','value':789},{'name':'def','value':1}],
|
63
|
+
map = new Map,
|
64
|
+
results = [];
|
63
65
|
|
64
|
-
|
66
|
+
src.reduce(function (map, current) {
|
65
67
|
var name = current.name;
|
66
68
|
|
67
69
|
if (map.has(name)) {
|
@@ -71,14 +73,16 @@
|
|
71
73
|
}
|
72
74
|
|
73
75
|
return map;
|
76
|
+
}, map).forEach(function (value, key, map) {
|
77
|
+
this.push({name: key, value: value});
|
74
|
-
},
|
78
|
+
}, results);
|
75
79
|
|
76
|
-
var results = [...map.entries()].map(function (entry) {
|
77
|
-
return {name: entry[0], value: entry[1]};
|
78
|
-
});
|
79
|
-
|
80
80
|
console.log(JSON.stringify(results)); // [[{"name":"abc","value":223},{"name":"def","value":51},{"name":"hij","value":789}]
|
81
81
|
console.log(JSON.stringify([...map.entries()])); // [["abc",223],["def",51],["hij",789]]
|
82
82
|
```
|
83
83
|
|
84
|
+
### 更新履歴
|
85
|
+
|
86
|
+
- 2016/12/28 00:08 ES6版を Map#forEach を使ったコードに修正
|
87
|
+
|
84
88
|
Re: stakezaki さん
|
1
typo修正
answer
CHANGED
File without changes
|