Open12

rubyで配列・hash・jsonの操作メモ

youfukuyoufuku

取得

array  = ["a","b","c","d","e","f","g","h","i","j","k"]

p array[0]
=> "a"

p array.first
=> "a"

p array.second 
=> "b"

p array.third 
=> "c"

p array.fourth
=> "d"

p array.last 
=> "k"
array  = ["a","b","c","d","e","f","g","h","i","j","k"]

array.from(1)
=> ["b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]

array.to(2)
=> ["a", "b", "c"]

array[1..-1] 
=> ["b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]

array[1, 3] 
=> ["b", "c", "d"]
youfukuyoufuku

追加

array  = ["a","b","c","d"]
array[4] = "e"
p array
=> ["a", "b", "c", "d", "e"]

array.push("f")
p array
=> ["a", "b", "c", "d", "e", "f"]

array << 'hoge'
p array
=> ["a", "b", "c", "d", "e", "f", "hoge"]

array.append(3) 
p array
=> ["a", "b", "c", "d", "e", "f", "hoge", 3]

array.prepend(-1) 
p array
=> [-1, "a", "b", "c", "d", "e", "f", "hoge", 3]
youfukuyoufuku

更新

array  = ["a","b","c","d"]
array[0] = "e"
p array
=> ["e", "b", "c", "d"]
youfukuyoufuku

削除

array  = ["a","b","c","d","f"]
array.delete("a");
p array
=> ["b", "c", "d", "f"]
youfukuyoufuku

多重階層を1階層に変換

array  = [["a", "b", "c"],["d", "e", "f"]]
array.flatten!
p array
=> ["a", "b", "c", "d", "e", "f"] 
youfukuyoufuku

配列同士の結合

array_a  = ["a", "b", "c"]
array_b  = ["d", "e", "f"]
array_a.concat(array_b)
p array_a
=> ["a", "b", "c", "d", "e", "f"] 

array_a  = ["a", "b", "c"]
array_b  = ["d", "e", "f"]
array_a << array_b
p array_a
=> ["a", "b", "c", ["d", "e", "f"]]
p array_a.flatten
=> ["a", "b", "c", "d", "e", "f"]  
youfukuyoufuku

配列内hashをhashに変換(※キーが被っていないことが条件になります)

array_value = [
  {:a=>[1, 2, 3, 4]}, 
  {:b=>[1, 4, 5, 6]}
]
p array_value
=> [{:a=>[1, 2, 3, 4]}, {:b=>[1, 4, 5, 6]}]

hash_value = {}.merge(*array_value)
p hash_value
=> {:a=>[1, 2, 3, 4], :b=>[1, 4, 5, 6]}

もし、キーが被っている場合、後勝ち(後ろの値で上書き)となります

array_value = [
  {:a=>[1, 2, 3, 4]}, 
  {:b=>[1, 4, 5, 6]},
  {:a=>[5]}, 
]
p array_value
[{:a=>[1, 2, 3, 4]}, {:b=>[1, 4, 5, 6]}, {:a=>[5]}]

hash_value = {}.merge(*array_value)
p hash_value
=> {:a=>[5], :b=>[1, 4, 5, 6]}
youfukuyoufuku

hashのキーとバリューを反転

array_value = [
  {:a=>[1, 2, 3, 4]}, 
  {:b=>[1, 4, 5, 6]}
]
hash_value = {}.merge(*array_value)
p hash_value
=> {:a=>[1, 2, 3, 4], :b=>[1, 4, 5, 6]}

p hash_value.invert
=> {[1, 2, 3, 4]=>:a, [1, 4, 5, 6]=>:b}
youfukuyoufuku

hashが入った配列で、hash内の配列の値でグルーピングし、その値をキーとした配列を作成

参考記事
https://gist.github.com/maoringo/4ed4fa9d268c7b2f1dc1

上記のままだと指定がし辛かったので、元情報を編集

# 元の情報
=> [{:id=>"a", :user_ids=>[1, 2, 3, 4]}, {:id=>"b", :user_ids=>[1, 4, 5, 6]}]
# 入れ替え後の情報
=> {1=>["a", "b"], 2=>["a"], 3=>["a"], 4=>["a", "b"], 5=>["b"], 6=>["b"]}
# 元の情報
array_value = [
  { id: 'a', user_ids: [1, 2, 3, 4] },
  { id: 'b', user_ids: [1, 4, 5, 6] }
]

array_value.flat_map { |hash_value| hash_value[:user_ids].map { |user_id| { user_id:, id: hash_value[:id] } } }
           .group_by { |b| b[:user_id] }
           .transform_values { |c| c.map { |d| d[:id] } }
youfukuyoufuku

上記を作った後、できることに気づいた。。。

# 元の情報
=> {"a"=>[1, 2, 3, 4], "b"=>[1, 4, 5, 6]}
# 入れ替え後の情報
=> {1=>["a", "b"], 2=>["a"], 3=>["a"], 4=>["a", "b"], 5=>["b"], 6=>["b"]}
hash_value = {
  'a': [1, 2, 3, 4],
  'b': [1, 4, 5, 6]
}

hash_value.flat_map { |key , value|value.map { |user_id|{ user_id: user_id.to_s, id: key.to_s}}}
          .group_by{|b| b[:user_id]}
          .transform_values{|c| c.map{|d| d[:id]}}