Open12
rubyで配列・hash・jsonの操作メモ
生成
array = []
p array
=> []
array = [1,2,3]
p array
=> [1, 2, 3]
連番
(1..5).to_a
=> [1, 2, 3, 4, 5]
取得
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"]
追加
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]
更新
array = ["a","b","c","d"]
array[0] = "e"
p array
=> ["e", "b", "c", "d"]
削除
array = ["a","b","c","d","f"]
array.delete("a");
p array
=> ["b", "c", "d", "f"]
多重階層を1階層に変換
array = [["a", "b", "c"],["d", "e", "f"]]
array.flatten!
p array
=> ["a", "b", "c", "d", "e", "f"]
配列同士の結合
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"]
配列内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]}
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}
hashが入った配列で、hash内の配列の値でグルーピングし、その値をキーとした配列を作成
参考記事
上記のままだと指定がし辛かったので、元情報を編集
# 元の情報
=> [{: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] } }
上記を作った後、できることに気づいた。。。
# 元の情報
=> {"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]}}