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

回答編集履歴

2

おまけ追加

2020/02/27 10:22

投稿

miyabi-sun
miyabi-sun

スコア21459

answer CHANGED
@@ -1,13 +1,12 @@
1
1
  Lodashに[groupBy](https://lodash.com/docs/4.17.11#groupBy)があるので瞬殺です。
2
2
 
3
3
  オブジェクトになるじゃねーか!
4
- なので[values](https://lodash.com/docs/4.17.15#values)や[Object.values](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values)と組み合わせましょうね。
4
+ なので[values](https://lodash.com/docs/4.17.15#values)と組み合わせましょうね。
5
5
 
6
6
  [Online Lodash Tester](https://codepen.io/travist/full/jrBjBz/)で調べてみましょう。
7
7
  ついでに[チェーン記法](https://qiita.com/kurararara/items/fb470ea71e59cd0371d4)を使ってかっこよく仕上げます。
8
8
 
9
9
  ```js
10
- const _ = require('lodash');
11
10
  const data = [
12
11
  {fruit: 'apple', price: 100},
13
12
  {fruit: 'orange', price: 120},
@@ -51,4 +50,65 @@
51
50
  }
52
51
  ]
53
52
  ]
53
+ ```
54
+
55
+ ---
56
+
57
+ 【おまけ】 ネイティブJSで頑張る
58
+
59
+ ネイティブJSにはgroupByなどという軟弱なものはありませんので、
60
+ reduceでチクチク実装する必要があります。
61
+
62
+ ネイティブJSにもES2017という比較的新しい機能として[Object.values](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values)実装されていますので、
63
+ 一度オブジェクトを経由するのが分かりやすいですね。
64
+
65
+ ```js
66
+ const data = [
67
+ {fruit: 'apple', price: 100},
68
+ {fruit: 'orange', price: 120},
69
+ {fruit: 'apple', price: 200},
70
+ {fruit: 'orange', price: 130},
71
+ {fruit: 'apple', price: 140},
72
+ ];
73
+
74
+ const result = Object.values(
75
+ data.reduce((obj, it) => {
76
+ if (!obj[it.fruit]) obj[it.fruit] = [];
77
+ obj[it.fruit].push(it);
78
+ return obj;
79
+ }, {})
80
+ );
81
+
82
+ console.log(JSON.stringify(result, null, 2));
83
+ ```
84
+
85
+ 結果
86
+
87
+ ```json
88
+ [
89
+ [
90
+ {
91
+ "fruit": "apple",
92
+ "price": 100
93
+ },
94
+ {
95
+ "fruit": "apple",
96
+ "price": 200
97
+ },
98
+ {
99
+ "fruit": "apple",
100
+ "price": 140
101
+ }
102
+ ],
103
+ [
104
+ {
105
+ "fruit": "orange",
106
+ "price": 120
107
+ },
108
+ {
109
+ "fruit": "orange",
110
+ "price": 130
111
+ }
112
+ ]
113
+ ]
54
114
  ```

1

ぷち修正

2020/02/27 10:22

投稿

miyabi-sun
miyabi-sun

スコア21459

answer CHANGED
@@ -1,9 +1,10 @@
1
1
  Lodashに[groupBy](https://lodash.com/docs/4.17.11#groupBy)があるので瞬殺です。
2
2
 
3
3
  オブジェクトになるじゃねーか!
4
- なので[Object.values](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values)と組み合わせましょうね。
4
+ なので[values](https://lodash.com/docs/4.17.15#values)や[Object.values](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values)と組み合わせましょうね。
5
5
 
6
6
  [Online Lodash Tester](https://codepen.io/travist/full/jrBjBz/)で調べてみましょう。
7
+ ついでに[チェーン記法](https://qiita.com/kurararara/items/fb470ea71e59cd0371d4)を使ってかっこよく仕上げます。
7
8
 
8
9
  ```js
9
10
  const _ = require('lodash');
@@ -17,7 +18,7 @@
17
18
 
18
19
  result = _(data)
19
20
  .groupBy(it => it.fruit)
20
- .thru(Object.values)
21
+ .values()
21
22
  .value()
22
23
  ```
23
24