【问题标题】:Sort array of hashes对哈希数组进行排序
【发布时间】:2019-04-25 05:27:05
【问题描述】:

我有这个哈希数组:

@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]

我正在尝试按结果排序,然后按名称:

@results.sort_by!{ |h| [h.res, h.name] }.reverse!

我得到这个错误:

undefined method `res' for {:res=>39, :name=>"cain"}:Hash

任何想法,请。

【问题讨论】:

  • 你能澄清一下,具体是什么不清楚给你的错误信息吗?它说Hash 没有名为res 的方法,如果您查看Hash 类的文档,您会发现确实没有该名称的方法。

标签: ruby sorting hash


【解决方案1】:

与 JavaScript 不同,您不能在哈希上调用 h.res 来获取 res 值。您必须使用[] 运算符来完成:

@results.sort_by! { |h| [h[:res], h[:name]] }.reverse!

【讨论】:

  • 也可以避免反转结果@results.sort { |h1, h2| [h2[:res], h2[:name]] <=> [h1[:res], h1[:name]] }
  • @AlekseiMatiushkin sort_by 几乎每次都比sort 更可取,因为它执行的转换更少,每个元素一次而不是每个比较两次
【解决方案2】:

这也是一样的:

@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]
@results.sort_by! { |h| h[:res] }

【讨论】:

  • 是的,但除了“res”我想按名称排序。
  • 然后使用 :name 代替 :res
  • :(如果res等于2条记录,他想按name排序,你的查询不满足。
  • :(同样查询返回升序而不是上面res的降序。
【解决方案3】:

交叉条件参数以按相反方向按名称排序:

results.sort{ |h1, h2| [h2[:res], h2[:name]] <=> [h2[:res], h2[:name]] }
#=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}, {:res=>33, :name=>"al"}]


results.sort{ |h1, h2| [h2[:res], h1[:name]] <=> [h1[:res], h2[:name]] }
#=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"cain"}, {:res=>39, :name=>"dan"}, {:res=>33, :name=>"al"}, {:res=>33, :name=>"billy"}]

【讨论】:

  • @CarySwoveland 知道了;)
【解决方案4】:

您可以使用Enumerable#max_by(带参数)。

@results.max_by(@results.size) { |h| h.values_at(:res, :name) }
  #=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"},
  #    {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2010-09-11
    • 2020-04-05
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多