我试图从最低到最高的哈希数组中返回一个值列表。我正在使用google_drive gem从谷歌电子表格中提取数字,显示足球信息:
这是我在的地方:
require 'rubygems'
require 'google_drive'
session = GoogleDrive.login("EMAIL", "PASS")
v_qb_w1 = session.spreadsheet_by_key("xxxxxxxx").worksheets[0]
@quarterbacks = [
{ name: v_qb_w1[2, 1], projection: v_qb_w1[2, 2], salary: v_qb_w1[2, 3], dpp: v_qb_w1[2, 4], ppd: v_qb_w1[2, 5] },
{ name: v_qb_w1[3, 1], projection: v_qb_w1[3, 2], salary: v_qb_w1[3, 3], dpp: v_qb_w1[3, 4], ppd: v_qb_w1[3, 5] },
{ name: v_qb_w1[4, 1], projection: v_qb_w1[4, 2], salary: v_qb_w1[4, 3], dpp: v_qb_w1[4, 4], ppd: v_qb_w1[4, 5] }
]
puts "Value:"
@quarterbacks.sort_by do |key, value|
dpp = []
dpp << key[:dpp].to_f.to_s
puts dpp.flatten.sort.reverse
end
最后一个块只是我试图尝试将dpp键值从最低到最高排序的尝试之一。没有什么失败,它只是没有改变任何东西。我已经尝试过grouby_by方法,只是没有运气安排我的关键值
解:
@quarterbacks.sort_by! { |qb| qb[:dpp] }
@quarterbacks.each { |qb| puts qb[:dpp] }
首先,sort_by
返回排序列表,它不会对它进行排序。这意味着:
@quarterbacks.sort_by { ... }
你没有做任何有用的事情,因为你丢掉了排序的结果。您需要添加作业或使用sort_by!
:
@quarterbacks = @quarterbacks.sort_by { ... }
# or
@quarterbacks.sort_by! { ... }
然后你就会明白sort_by
块是如何工作的。 sort_by
使用块的返回值进行排序,它或多或少是这样的:
array.map { |e| [ sort_by_block_value[e], e ] }
.sort { |a, b| a.first <=> b.first }
.map { |e| e.last }
所以你的块需要返回一些合理的东西而不是nil
返回的puts
:
@quarterbacks.sort_by! { |q| q[:dpp] }
试试这个
@quarterbacks.sort_by!{|qb| qb[:dpp]}
你正试图对Array
进行排序。现在你传递Hash
(k)和nil
(v),因为每个四分卫都存储为Hash
所以key => value
中没有Array
关联。也将把回归nil
所以你告诉它重复nil
对nil
。
上面的代码将按照每个Array
的Hash
属性对:dpp
的Hash
进行排序,这看起来就像你要求的那样。在这种情况下,!
意味着它将改变接收器改变@quarterbacks
实例变量以进行分类。