我试图返回从最低到最高的哈希数组内的值列表。我正在使用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] }
答案 0 :(得分:2)
试试这个
@quarterbacks.sort_by!{|qb| qb[:dpp]}
您正在尝试对Array
进行排序。现在你传递Hash
(k)和nil
(v),因为每个四分卫都存储为Hash
,因此key => value
中没有Array
关联}。此外,puts会返回nil
,因此您要告诉它重复nil
对nil
的排序。
上面的代码会根据每个Array
的{{1}}属性对Hash
:dpp
个Hash
进行排序,这似乎就像您要求的那样。在这种情况下,!
意味着它将改变接收器改变@quarterbacks
实例变量以进行适当的排序。
答案 1 :(得分:2)
首先,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] }