1

どのように変換しますか:

x = [
 {"a" => ["a","b","c","d","e"]}, 
 {"f" => ["f","g","h","i","j","k","l","m","n"]}, 
 {"f" => ["o","p"]}
]

の中へ:

{
 "a"=>["a", "b", "c", "d", "e"], 
 "f" => ["f","g","h","i","j","k","l","m","n"]}, 
 "f01"=>["o", "p"] 
}

もともと使っていた

x.reduce({},:update)

ただし、これは最初の「f」をオーバーライドします (キーが一意であるため)。

私は答えを探しましたが、この場合にうまくいくものは見つかりませんでした。

4

4 に答える 4

4

キーを変更した後の結果のハッシュは、非常に難しい問題になります。結果のハッシュとその配列を簡単に調べるにはどうすればよいでしょうか?

必要なハッシュの種類を再考することをお勧めします。検索が難しく、元のハッシュ キーとの関連付けが希薄な新しいハッシュ キーを作成する代わりに、元のキーを再利用して、配列の配列を指すハッシュ キーを作成します。はるかに単純なハッシュの開始配列から始めます。

x = [
  {'a' => ['a', 'b']},
  {'f' => ['f', 'g']},
  {'f' => ['o', 'p']}
]

コードは次のとおりです。

hash = x.each_with_object(Hash.new{ |h, k| h[k] = [] }) { |e, h| 
  k, v = e.flatten
  h[k] << v
}

pp hash

これは出力です:

{"a"=>[["a", "b"]], "f"=>[["f", "g"], ["o", "p"]]}

ルックアップはよりシンプルになります:

hash['f'][0]
# => ["f", "g"]
hash['f'].last
# => ["o", "p"]

元の配列の分離を維持しながら、より論理的ではるかに単純なルックアップを取得します。

ハッシュに割り当てられているサブ配列の数を知る必要がある場合も簡単です。

hash['f'].size
# => 2

すべてのエントリを繰り返し処理したい場合'f'は、設計が複雑で困難になるため、次のようにします。

hash['f'].each do |f|
  ...
end

また:

hash['f'].map { |f|
  ...
}
于 2013-06-01T03:29:31.777 に答える
1

inject次のように使用できます。

 > x.inject({}){|r,h| r[h.keys.first] ||= [] ; r[h.keys.first] << h.values.first; r}
  => {"a"=>[["a", "b", "c", "d", "e"]], 
      "f"=>[["f", "g", "h", "i", "j", "k", "l", "m", "n"], ["o", "p"]]} 

同じキーに対して複数の配列を取得することに注意してください。(IE "f")

結果のハッシュは、要求したものとは少し異なりますが、変更されたキーとの混乱がないため、さらに使いやすいかもしれません。

于 2013-05-31T22:52:46.543 に答える
1
x = [
 {"a" => ["a","b","c","d","e"]}, 
 {"f" => ["f","g","h","i","j","k","l","m","n"]}, 
 {"f" => ["o","p"]}
]

res = x.collect{|d| d.first}.each_with_object({}) do |(k,v), h, n = "00"|
  (k += n.next!) if (h.key? k)
  h[k] = v
end

res == {
 "a"=>["a", "b", "c", "d", "e"], 
 "f" => ["f","g","h","i","j","k","l","m","n"], 
 "f01"=>["o", "p"] 
}
于 2013-05-31T23:06:20.247 に答える
1

01の部分f01が単なるカウンターであり、その数値のフォーマットを気にしないと仮定すると、次のことができます。

def reduce_update_incr(arr)
  key_count = {}
  arr.reduce({}) do |memo,h|
    h.each do |k,v|
      k = k + (key_count[k]=(key_count[k]||0)+1).to_s if memo.include?(k)
      memo[k] = v
    end
    memo
  end
end

reduce_update_incr(x)
# {"a"=>["a", "b", "c", "d", "e"],
#  "f"=>["f", "g", "h", "i", "j", "k", "l", "m", "n"],
#  "f1"=>["o", "p"]}

うん。

于 2013-05-31T22:15:22.717 に答える