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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

2516閲覧

2つの配列を同時にeach - 2つの配列を統合して並び替え

michopp

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/04/24 09:22

@prefecture_array = [ id: 1, name: "北海道"], [ id: 5, name: "東京"]

@city_array = [id: 35, prefecture_id: 2, name: "札幌"], [ id: 49, prefecture_id: 10, name: "浜松"], [ id: 51, prefecture_id: 15, name: "神戸"]

上記の配列があり、
@prefecture_arrayのidと、@city_arrayのprefecture_idを調べて、1~順にソートしたいのですが、(この場合は北海道、札幌、東京、浜松、神戸の順に)下記の方法で試していますが、上手くソートができません。

どなたか方法が分かります方、お教え頂けませんでしょうか?

ruby

1 all_array = [] 2 @prefecture_array.each do |prefecture| 3 @area_group_array.each do |area_group| 4 if prefecture.id <= area_group.prefecture_id 5 all_array << prefecture 6 elsif area_group.prefecture_id < prefecture.id 7 all_array << area_group 8 end 9 end 10 @all_array = all_array 11 end 12 13また、 14 15 all_array = [] 16 @prefecture_array.zip(@area_group_array).each do |prefecture, area_group| 17 if prefecture.id <= area_group.prefecture_id 18 all_array << prefecture 19 elsif area_group.prefecture_id < prefecture.id 20 all_array << area_group 21 end 22 end 23 @array = all_array

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

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

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

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

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

gouf

2017/04/24 10:32

仮にこれを実現したとして、実際にやりたいことはなんですか(より簡単な方法が見つかるかもしれません)
michopp

2017/04/25 01:45

有難うございます。選択したPrefecturesとCitiesをviewで表示させる時に、別々に表示をするのではなく、例えば北海道と札幌が選択されていたとすると、北海道・札幌の順に並び替えたいです。同じエリアという枠の中で表示したいので、都道府県でも都市名であっても、別々ではなく、同じ認識として表示させたいというのが主旨になります。
guest

回答2

0

ベストアンサー

all_arr = [] prefecture_arr = [{id: 1,name:"北海道"},{id: 5,name: "東京"}] city_arr = [{id: 35, prefecture_id: 2, name: "札幌"},{id: 49, prefecture_id: 10, name: "浜松"}] all_arr.push(prefecture_arr, city_arr) def has_prefecture?(arr) Hash[arr].has_key?(:prefecture_id) end all_arr = all_arr.flatten.map(&:to_a).sort{ |a, b| #p b if has_prefecture?(a) && has_prefecture?(b) a[1][1] <=> b[1][1] elsif has_prefecture?(a) a[1][1] <=> b[0][1] elsif has_prefecture?(b) a[0][1] <=> b[1][1] else a[0][1] <=> b[0][1] end }.map{|s| Hash[s]} p all_arr
[{:id=>1, :name=>"北海道"}, {:id=>35, :prefecture_id=>2, :name=>"札幌"}, {:id=>5, :name=>"東京"}, {:id=>49, :prefecture_id=>10, :name=>"浜松"}]

cityのidを残した場合でのコードを書いてみました。
同時にいくつかのカラムを持つそうですが、現状どのようなものがあり、どの順番で格納されているかわからないため、sortの際のaとbの要素の取り出しは上記のようになっています
rails consoleで格納されている順番を確認したのち、それに対応したコードに変更してみてください

考え方としてはsortは二つの要素を比較して順番を入れ替えるメソッドなのでa,bの両方をhas_prefecture?メソッドでそれぞれの配列をhash化した後にprefecture_idのキーを持っているか判定
両方ともprefecture_idを持っていたらそれで比較
片方しかなかったらその片方をprefecture_idの持つバリュー、もう片方をidの持つバリューで比較
両方ともprefecture_idを持っていなかったらidで比較となっております
sortをする際にto_aでそれぞれの要素を配列化してしまったのでhash化してあげて終わりです。

投稿2017/04/26 02:00

haneru

総合スコア440

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

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

michopp

2017/04/27 06:56

こちらのご回答を実際の配列で試して、上手くいきました! 大変ご丁寧な解説、感謝いたします!
guest

0

@city_arrayのidは必要ないものと考えてもよろしいでしょうか?
それでしたらこちらのコードでどうでしょう

all_arr = [] prefecture_arr = [{id: 1,name:"北海道"},{id: 5,name: "東京"}] #p prefecture_arr city_arr = [{id: 35, prefecture_id: 2, name: "札幌"},{id: 49, prefecture_id: 10, name: "浜松"}] city_arr.map{|s| s.delete(:id)}#.tap{|s| p s } all_arr.push(prefecture_arr, city_arr) p all_arr.flatten.map(&:to_a).sort{|a, b| a[0][1] <=> b[0][1] }
[[[:id, 1], [:name, "北海道"]], [[:prefecture_id, 2], [:name, "札幌"]], [[:id, 5], [:name, "東京"]], [[:prefecture_id, 10], [:name, "浜松"]]]

軽く解説すると

  1. 空の配列を用意
  2. city_arrのハッシュの:idの部分を削除する
  3. 空の配列にprefecture_arrayとcity_arrをpushで加える
  4. flattenで配列を平坦化したのちに全てのhashをto_aで配列化、その後sortでそれぞれの配列のid,もしくはprefecture_idの要素の値で並び替える

これで一応並び順を変えることが出来ました
@cityのidが必要でしたらまた考えてみます

投稿2017/04/25 09:44

haneru

総合スコア440

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

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

michopp

2017/04/25 11:14

haneru様、どうも有難うございます。 説明不足でしたが、実際のprefectureとcityはDBのテーブルから取得したものからか、cityの:idを削除する部分で上手く行きませんでした。 また、並び替えた要素を表示する際に、同時にいくつかのカラムの要素も持って来るため、できましたらcityもidを残しておきたいです。 こちらのご紹介いただいた方法も今後大変参考になると思いますので、感謝いたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問