下面是一个散列的例子:

h1 = {
  a1: :a2,
  b1: :b2,
  c1: :c2,
  d1: :d2,
  e1: :e2,
  f1: :f2
}

并且有这样一组键:

a1 = [:b1, :d1, :f1]

如何根据数组对此哈希的键进行排序?不在数组中的哈希键必须按排序的顺序出现在排序的哈希键之后.

结果:

{
  b1: :b2,
  d1: :d2,
  f1: :f2,
  a1: :a2,
  c1: :c2,
  e1: :e2
}

推荐答案

我会这么做:

h1.slice(*a1).merge(h1.except(*a1))
#=> {:b1=>:b2, :d1=>:d2, :f1=>:f2, :a1=>:a2, :c1=>:c2, :e1=>:e2}

Hash#slice按照元素在a1中的定义顺序返回h1中的元素.而Hash#except则返回丢失的数据.Hash#merge将两个组合并为一个散列.

Ruby相关问答推荐

Ruby迭代器与函数.返回函数的第一个值,而不交互整个列表

Procs的绑定

在Ruby中将嵌套哈希键从CamelCase转换为snake_case

如何关闭 Rails 3.1 上的自动样式表/javascript 生成?

Ruby:通过正则表达式过滤数组?

无法在 Heroku 教程中使用 Python 启动工头

如何在 ruby​​ 中编写负循环,例如 for(i=index; i >= 0; i --)

差异 - unless/if

判断字符串是否包含Ruby数组中的任何子字符串

使用 bundler 安装较新版本的 bundler

Ruby 中的p是什么?

你喜欢哪种风格的 Ruby 字符串引用?

在 Ruby 中, coerce() 是如何工作的?

如何理解 strptime 与 strftime

为什么表达式 (true == true == true) 会产生语法错误?

为什么在安装 gem 时出现权限被拒绝错误?

Ruby - 用另一个字符串替换第一次出现的子字符串

遍历数组的前 n 个元素

您的 Ruby 版本是 2.0.0,但您的 Gemfile 指定了 2.1.0

Ruby:如何计算一个字符串在另一个字符串中出现的次数?