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

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

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

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

Q&A

解決済

3回答

13540閲覧

【Ruby】Hashの先頭キー取得方法

mukkun

総合スコア882

Ruby

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

0グッド

0クリップ

投稿2016/12/20 06:45

編集2016/12/20 08:48

JSON

1{ 2 "a": [1, 2, 3], 3 "b": [1, 2, 3], 4... 5}

のようなhashで、
value中に存在するarrayの要素数でループということをしたいのですが、
いい感じの書き方が見つからず、質問させていただきました。

条件

① 配列の要素数はすべて同じになります。
② aやbとは限らず、動的に変わるという条件になります。
③ values[0]となっていますが、最初のキーである必要はございません。

試したこと

Ruby

1# Data 2data = { 3 A: { 4 a: [1, 2, 3], 5 b: [1, 2, 3] 6 } 7} 8 9 10# 嫌い だけどできる 11data[:A].values[0].each do .... 12 13# 理想? 14data[:A].first_key.each do ....

Rubyは美しく書かなければいけないという使命感にかられております。
よろしくお願い致します。

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

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

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

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

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

maisumakun

2016/12/20 07:24

全部のキーが同じ要素数の配列を持っている、ということで間違いないでしょうか。
mukkun

2016/12/20 07:28

申し訳ございません。肝心な部分が抜けておりました。質問内容を修正致しましたので、よろしくお願い致します。
ikedas

2016/12/20 07:37

冒頭のデータがJSON形式のように見えません。できればRubyの式などで書いてもらえますか。
mukkun

2016/12/20 08:06

JSONが意味わからないことになっていました。。実際のデータとは異なりますが、rubyのコードを追記させていただきました。
ikedas

2016/12/20 08:32

「最初」のキーの値のみを処理する意図・背景は何でしょうか。
mukkun

2016/12/20 08:47

arrayの要素分ループさせたいので、要素数を取得できれば最初のキーである必要はございません。質問内容にも明記致します。
guest

回答3

0

data[:A].first.popの方法もありますが、
data[:A].values.firstの方が要素でループする意図が伝わりやすいと思います。

ruby

1data = { 2 A: { 3 a: [1, 2, 3], 4 b: [1, 2, 3] 5 } 6} 7 8data[:A].first.pop.each do |v| 9end 10 11data[:A].values.first.each do |v| 12end

投稿2016/12/20 14:44

cameluby

総合スコア891

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

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

mukkun

2016/12/21 00:18

ご回答ありがとうございます。 popは誤解を招きそうですが、 values.firstという方法も確かにありますね!
guest

0

data[:A].flatten[1].each ..

は如何でしょう?

$ irb irb(main):001:0> data = { irb(main):002:1* A: { irb(main):003:2* a: [1, 2, 3], irb(main):004:2* b: [1, 2, 3] irb(main):005:2> } irb(main):006:1> } => {:A=>{:a=>[1, 2, 3], :b=>[1, 2, 3]}} irb(main):007:0> data[:A].flatten => [:a, [1, 2, 3], :b, [1, 2, 3]] irb(main):008:0> data[:A].flatten[1] => [1, 2, 3]

投稿2016/12/20 13:43

katoy

総合スコア22324

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

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

mukkun

2016/12/21 00:15

ご回答ありがとうございます。 確かに「flatten」でも取れますね!盲点でした。 ただ、こちらも読み手には伝わりづらいかもしれませんね。。
guest

0

ベストアンサー

RubyのHashはEnumerableなので、Hash#first[キー, 値]という配列がとれます。

とは言え、data[:A].first.last.each doと書いても意味不明感が増しそうです。

投稿2016/12/20 07:51

maisumakun

総合スコア145238

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

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

mukkun

2016/12/20 08:23

回答ありがとうございます。 確かに速度は速くなりますが、読み手からしたらfirstなのかlastなのかどっちなんだ!? となりますよね。。 Rubyならいい感じの関数が用意されてると思ったのですが、firstが最善なんでしょうか。。 valuesと比べたらこういう書き方のほうがよさそうですね。 data[:A].first[1].each do
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問