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

回答編集履歴

4

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

2016/12/27 16:38

投稿

think49
think49

スコア18194

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コードを三項演算子を使ったコードに修正

2016/12/27 16:38

投稿

think49
think49

スコア18194

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
- map.set(name, map.get(name) + current.value);
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:08 ES6版を Map#forEach を使ったコードに修正
83
+ - 2016/12/28 00:32 new Mapコード三項演算子を使ったコードに修正
87
84
 
88
85
  Re: stakezaki さん

2

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

2016/12/27 15:32

投稿

think49
think49

スコア18194

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
- var map = src.reduce(function (map, current) {
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
- }, new Map);
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修正

2016/12/27 15:08

投稿

think49
think49

スコア18194

answer CHANGED
File without changes