130
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ついに JavaScript に groupBy が実装されたぞ!!!

Last updated at Posted at 2023-11-29

JavaScript標準でgroupBy関数が実装されています。2023年11月現在Safari以外の主要なブラウザで実装済みで、SafariもTechnology Previewのようです。
現在MDNの日本語の記事は古い情報のままになっており、現行と異なるので注意! →更新していただきました。ありがとうございます!)

Proposal の Stage はすでに 4 / Finished なので規格として確定済みです。

基本的な使い方

よくあるgroupByです。配列(Iterable)とキーを抽出する関数の二つを指定すると、キーで配列をグループ化します。

const ret = Object.groupBy([
  { name: '山田太郎', address: '東京' },
  { name: '山田次郎', address: '愛知' },
  { name: '山田三郎', address: '大阪' },
  { name: '山田四郎', address: '東京' },
], x => x.address);
// ret = {
//   "東京": [
//     { "name": "山田太郎", "address": "東京" },
//     { "name": "山田四郎", "address": "東京" }
//   ],
//   "愛知": [
//     { "name": "山田次郎", "address": "愛知" }
//   ],
//   "大阪": [
//     { "name": "山田三郎", "address": "大阪" }
//   ]
// }

2つある

JavaScriptのgroupByは2つあります。Object.groupBy()Map.groupBy() です。Object.groupBy() はプレーンなオブジェクトで返し、Map.groupBy()Map 型で返します。

プレーンなオブジェクトのキー(プロパティ)になれるのは文字列だけなので、文字列以外をキーにしたい場合は Map.groupBy() を使うという事です。

Map.groupBy([{ hoge: 3 }, { hoge: 4 }, { hoge: 3 }], x => x.hoge);

配列のメソッドではない

groupByは配列のメソッドになるのが直感的と思いますが、ObjectMap の静的メソッドになっています。これはライブラリの中には配列のプロトタイプを書き換えてgroupByを挿入するものがあるのでそれの互換性を崩さないようにした結果のようです。

正直 Array に入れた方が自然でよい気がしますがね。今後もこういうみんなほしいと思っているメソッドは全部不自然な形でしか標準には入れられないという事になっちゃうのかな…そこは残念。

130
65
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
130
65

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?