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

假设该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 回答
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"]]} 

请注意,您将获得同一个键的多个数组。(即"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 回答