Ruby中的数组转哈希表

4

输入:

 a = [[:a, "apple"], [:b, "bear"]]

输出:

 {:a=>"apple", :b=>"bear"}

我认为可以这样做:
h = a.inject({}){|dic,i| dic.merge({i[0]=>i[1]})}

但我仍然认为这不是最好的方法。是否有更好的解决方案?

1
你在这里做的是为每个键值对创建一个全新的哈希,然后使用 merge 为列表中的每个键值对创建另外一个哈希。由于所创建的中间哈希数量将是您的列表长度的两倍,因此这种方法效率极低。 这个高效的 inject 版本应该是:h = a.inject({ }) { |h, (k, v)| h[k] = v; h } - tadman
1
Enumerable转哈希来袭:https://dev59.com/IWox5IYBdhLWcg3wGwpo. - tokland
1个回答

10
>> Hash[*a.flatten]
=> {:a=>"apple", :b=>"bear"}

或者一个更漂亮的:

>> Hash[a] 

或者在2.1之后:

>> a.to_h

1
"Hash[]"这个名字对于一个非常方便的东西来说真的很尴尬。 - tadman
Hash[a] 在 Ruby 1.8.7 中也可以使用。因此,我们基本上可以清除丑陋的 hack *+flatten。 - tokland
@tadman:并不是说人们没有试图说服开发人员添加一种将可枚举对象转换为哈希的方法。但是没有成功:http://bugs.ruby-lang.org/issues/show/666 - tokland
@tokland 谢谢。我原以为它只在1.9中有效。但是它们之间似乎有一些差异。哈希中元素的顺序在1.8和1.9中不同。例如,Hash[[["a", 100], ["b", 200]]].each将在1.8中首先处理"b"=>200 - halfelf
@halfelf:这是一个正交问题。1.9版本中的哈希(Hash)是有序的,在1.8.7版本中则不是。构建哈希的方式并不重要。我会颠倒回答中的文本(从更重要的开始!)。“哈希[a],只有当你使用古老的Ruby <= 1.8.6时,才使用这个丑陋的hack”等等。 - tokland
Hash[] 的问题在于它不像一流的 to_hto_hash 方法那样接受额外的参数。 - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接