我想通过几个动态标准对哈希数组进行排序.假设我有这个数组 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: "
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,我们将该值反转.如果比较器返回不同的值,我们不需要继续迭代.