加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组 – 在Ruby中动态排序哈希数组

发布时间:2020-12-17 01:24:45 所属栏目:百科 来源:网络整理
导读:我想通过几个动态标准对哈希数组进行排序.假设我有这个数组 persons = [ { id: 1,first_name: "Bill",last_name: "Zamora",age: 37 },{ id: 2,first_name: "Alexia",last_name: "Reyes",age: 70 },{ id: 3,first_name: "Anthony",last_name: "Nelson",age: 2
我想通过几个动态标准对哈希数组进行排序.假设我有这个数组

persons = [
  {
    id: 1,first_name: "Bill",last_name: "Zamora",age: 37
  },{
    id: 2,first_name: "Alexia",last_name: "Reyes",age: 70
  },{
    id: 3,first_name: "Anthony",last_name: "Nelson",age: 25
  }
]

我知道您可以使用以下代码轻松地按多个条件对数组进行排序

persons.sort_by!{ |p| [p[:age],p[:first_name]] }

但是,在此示例中,对数组进行排序的字段的数量和顺序是硬编码的.就我而言,这是在运行时动态确定的.所以我不知道数组要排序多少个字段,哪个字段按哪个顺序排序.

我正在寻找一个优雅的解决方案,使用我以前不知道的配置对象对我的数组进行排序.这样的配置可能如下所示:

sort_settings = [
  {
    field: "first_name",order: "asc"
  },{
    field: "age",order: "desc"
  }
]

我非常感谢任何帮助!

解决方法

使用sort_by以desc顺序对字符串进行排序非常具有挑战性,最好使用“低级” sort方法,该方法使用< =>对指定的比较器进行排序.操作符.对此的快速解决方案如下所示:

persons.sort do |a,b|
  comparator = 0

  sort_settings.each do |s|
    a_field = a[s[:field].to_sym]
    b_field = b[s[:field].to_sym]

    comparator = a_field <=> b_field

    comparator = -comparator if s[:order] == "desc"

    break unless comparator == 0
  end

  comparator
end

该块必须实现a和b之间的比较,并且当a跟随b时返回-1,当a和b相等时返回0,或者如果b跟随a则返回1.

因此,我们迭代sort_settings并使用< =>比较指定的字段,返回1,0或-1.如果指定的顺序是desc,我们将该值反转.如果比较器返回不同的值,我们不需要继续迭代.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读