ruby - 如何映射哈希数组?

标签 ruby arrays hash

我有一个哈希数组:

arr = [ {:a => 1, :b => 2}, {:a => 3, :b => 4} ]

我想实现的是:

arr.map{|x| x[:a]}.reduce(:+)

但我认为它有点难看,或者至少不像:

arr.map(&:a).reduce(:+)

后一个是错误的,因为散列中没有名为a的方法。

有没有更好的方法来写map{|x| x[:a]}?

最佳答案

您可以制作实际的对象,可能使用 Struct :

MyClass = Struct.new :a, :b
arr = [MyClass.new(1, 2), MyClass.new(3, 4)]
arr.map(&:a).reduce(:+)  #=> 4

或者为了更灵活,一个OpenStruct :

require 'ostruct'
arr = [OpenStruct.new(a: 1, b: 2), OpenStruct.new(a: 3, b: 4)]
arr.map(&:a).reduce(:+)  #=> 4

当然,这些中的任何一个都可以从现有的散列中构建:

arr = [{ :a => 1, :b => 2 }, { :a => 3, :b => 4 }]

ss = arr.map { |h| h.values_at :a, :b }.map { |attrs| MyClass.new(*attrs) }
ss.map(&:a).reduce(:+)  #=> 4

oss = arr.map { |attrs| OpenStruct.new attrs }
oss.map(&:a).reduce(:+)  #=> 4

或者,对于更有创意、更实用的方法:

def hash_accessor attr; ->(hash) { hash[attr] }; end
arr = [{ :a => 1, :b => 2 }, { :a => 3, :b => 4 }]
arr.map(&hash_accessor(:a)).reduce(:+)  #=> 4

关于ruby - 如何映射哈希数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908380/

相关文章:

javascript - 如何用普通的旧 JavaScript 读取 Angular 表达式

c - C 语言的 SHA-512 源代码

java - 如何检查 XML 文件中的更改?

ruby - 如何调用在不同上下文中获取 block 的 Proc?

php - 体验与框架 : PHP vs Rails

ruby-on-rails - rails 和 rake 有什么区别?

ruby - 将一个大数组解析为多个子数组

android - 在 ListView 中创建数组

ruby-on-rails - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055)

ruby-on-rails - 无方法错误 : undefined method `symbolize_keys!' for Hash