【问题标题】:Reduce a Ruby array of hashes [closed]减少 Ruby 哈希数组 [关闭]
【发布时间】:2014-02-18 21:57:16
【问题描述】:

我有一个 arrayhash 值:

> taxes = [{:name=>"foo", :rate=>0.5}, {:name=>"bar", :rate=>2.5}] 
=> [{:name=>"foo", :rate=>0.5}, {:name=>"bar", :rate=>2.5}] 

这可以总结费率:

> taxes.reduce(0) {|sum,element|sum + element[:rate]}
=> 3.0 

还有其他更容易理解和简洁的方法吗?

** 编辑 **

为了比较(是的,我意识到这只是一个数组):

>> [1,2,3].reduce(:+)
=> 6

【问题讨论】:

  • 你所拥有的有什么问题?你想要更短的吗?
  • 你喜欢taxes.collect { |h| h[:rate] }.reduce(0,:+) # => 3.0 吗?
  • 文本难以理解和读者只是不熟悉某些东西是有区别的。函数式表示法不仅非常简洁,而且一旦读者熟悉了函数式概念,就可以成为最容易理解的表示法。
  • @ArupRakshit: inject 对我来说似乎更糟。
  • @craig 在 Rails 中,你可以像这样使用 Enumerable#sum:taxes.sum{|item| item[:rate]}

标签: ruby generics ruby-2.0


【解决方案1】:

也许使用常见的“map”和“reduce”函数更清楚?

taxes.map { |t| t[:rate] }.reduce(:+) # => 3.0 

【讨论】:

  • 坦率地说,我觉得这更令人困惑。我认为原始版本没有任何问题。
  • @nzifnab:是的,这个问题是主观的。
  • 我相信这个解决方案比较慢,因为它迭代了两次,一个是 map,另一个是 reduce。我是对的?
  • @Rafa:毫无疑问,一个简单的“减少”解决方案是最好的恕我直言。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2015-01-06
  • 2012-12-02
  • 2014-04-12
  • 2018-08-05
相关资源
最近更新 更多