質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

3122閲覧

Dateオブジェクトの入った配列を年月でグループ分けしたい

sabosan

総合スコア11

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/02/13 09:17

例えば下記のようなDateオブジェクトの入った配列があるとき、
年月でグループ分けするにはどのように書くと良いでしょうか?

Swift

1struct MediumEntity { 2 let createdAt: Date 3} 4 5var media: [MediumEntity] 6let dateString = ["2016/12/1", "2017/1/1", "2017/1/2", "2017/1/3", "2017/4/1", "2017/4/1"] 7let formatter = DateFormatter() 8formatter.dateFormat = "yyyy/MM/dd" 9media = dateString.map { MediumEntity.init(createdAt: formatter.date(from: $0)!) } 10 11/* 下記3つのグループに分けたい 12- 2016/12 (1点) 13- 2017/1 (3点) 14- 2017/4 (2点) 15*/ 16

mediaの範囲を求めて毎月なめていくとできそうではあるのですが。

Swift

1let fromDate = media.map { $0.createdAt }.min() 2let toDate = media.map { $0.createdAt }.max()

良い書き方がありましたらご教授いただけたらと思います。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Swift4からDictionaryのgroupingが追加されています。
【Swift】Dictionary(grouping by )を使ってセクション分けしたTableViewを作る
の記事を参考に作成できると思います。
上記の記事をコピペしてschedulesを作成するところで"yyyy/MM/dd"を"yyyy/MM"に変えたら年月でグルーピングできました。

投稿2018/02/13 13:29

nakasho_dev

総合スコア2655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sabosan

2018/02/14 00:29

ありがとうございます!! 教えていただいた通りにやったところグルーピングできました!! struct MediumEntity { let createdAt: Date } var media: [MediumEntity] let dateString = ["2016/12/1", "2017/1/1", "2017/1/2", "2017/1/3", "2017/4/1", "2017/4/1"] let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd" media = dateString.map { MediumEntity.init(createdAt: formatter.date(from: $0)!) } var classifyedMedia = [Date: [MediumEntity]]() classifyedMedia = Dictionary(grouping: media) { medium -> Date in formatter.dateFormat = "yyyy/MM" let string = formatter.string(from: medium.createdAt) return formatter.date(from: string)! }
nakasho_dev

2018/02/14 00:54

グルーピングできたようで、良かったです。出来上がったソースはコメント欄ではなく質問文の最後に追加する形のほうが、後から見た人がソースを見やすいと思います。
guest

0

Swiftには今のところ標準で用意されたgourpBy関数がありません。
また、これが決定打だというものもないので、Swift groupByで検索して気に入ったものを使うのが良いと思います。
RubyやPythonのように高階関数になっていて要素に対応したキーを返す関数を渡すとキーごとにグループ化されたDictionayが返されるものが多いようです。

投稿2018/02/13 12:11

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sabosan

2018/02/13 12:19

ありがとうございます!!試してみます!感謝ですmm
MasakiHori

2018/02/14 00:19

大変申し訳ないです。リファレンスなどから見落としていました。 nakasho_dev さんの方法が現状一番良いように思われます。
sabosan

2018/02/14 00:31

いえいえ! groupByというワードを知らなかったので勉強になりました! ありがとうございましたmm
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問