Ruby 按另一个数组对哈希数组排序

Ruby 按另一个数组对哈希数组排序,ruby,arrays,csv,hash,Ruby,Arrays,Csv,Hash,我得到了两个数组一个散列数组另一个键数组。我需要使散列数组和键数组的顺序相同。我该怎么做 header = ["header1", "header2", "header3", "header4", "header5"] record = [{"header4" =>"value4"}, {"header3" =>"value3"}, {"header5"=>"value5"}, {"header1"=>"value1"}, {"header2"=>"value2"}

我得到了两个数组一个散列数组另一个键数组。我需要使散列数组和键数组的顺序相同。我该怎么做

header = ["header1", "header2", "header3", "header4", "header5"]
record = [{"header4" =>"value4"}, {"header3" =>"value3"}, {"header5"=>"value5"}, {"header1"=>"value1"}, {"header2"=>"value2"}]
我需要数组记录与数组头的顺序相同

record = [{"header1" =>"value1"}, {"header2" =>"value2"}, {"header3"=>"value3"}, {"header4"=>"value4"}, {"header5"=>"value5"}]
非常感谢大家的帮助。我想在这篇文章中再补充一个问题。 我正在尝试使用下面建议的方法从数据库创建CSV文档。所以我想按特定的顺序组织列,我有这个顺序的模板,这个模板存储为标题数组,但当我这样做时

csv<< mymodel.attributes.values.sort_by! { |h| header.index(h.keys[0])
csv/接受块。块的返回值用于比较。对于您的情况,您可以使用

/接受一个区块。块的返回值用于比较。对于您的情况,您可以使用


对于这个简单的对象,您实际上不需要额外的数组,因为这样可以工作

record.sort_by do |hash| 
  hash.keys.find{|key| key=~ /header/}.scan(/\d+/).pop.to_i
end
#=> [{"header1"=>"value1"}, {"header2"=>"value2"}, {"header3"=>"value3"}, {"header4"=>"value4"}, {"header5"=>"value5"}]

我有一种感觉,虽然这个问题被剥离到基本的,但我想我会告诉你无论如何。由于您只想按页眉编号排序,因此将找到页眉键,然后弹出最后一个编号,并转换为整数进行排序。因此,它适用于任何带有键的
散列
“header1”
“header1432”

对于这个简单的对象,您实际上不需要额外的数组,因为这样可以工作

record.sort_by do |hash| 
  hash.keys.find{|key| key=~ /header/}.scan(/\d+/).pop.to_i
end
#=> [{"header1"=>"value1"}, {"header2"=>"value2"}, {"header3"=>"value3"}, {"header4"=>"value4"}, {"header5"=>"value5"}]

我有一种感觉,虽然这个问题被剥离到基本的,但我想我会告诉你无论如何。由于您只想按页眉编号排序,因此将找到页眉键,然后弹出最后一个编号,并转换为整数进行排序。因此,它将适用于任何带有键的
散列
“header1”
“header1432”

,我会像@falsetru那样做,但这里有另一种方法:

record.each_with_object({}) { |h,g| g[h.keys.first] = h }.values_at(*header)
  #=> [{"header1"=>"value1"}, {"header2"=>"value2"}, {"header3"=>"value3"},
  #    {"header4"=>"value4"}, {"header5"=>"value5"}]

我会像@falsetru那样做,但还有另一种方法:

record.each_with_object({}) { |h,g| g[h.keys.first] = h }.values_at(*header)
  #=> [{"header1"=>"value1"}, {"header2"=>"value2"}, {"header3"=>"value3"},
  #    {"header4"=>"value4"}, {"header5"=>"value5"}]

上面的答案都很好,但没有一个能在O(n)时间内完成操作。我认为可以通过将
结果
转换为临时哈希来提高理论性能和清晰度:

>> record_h = record.reduce(:merge)
=> {"header4"=>"value4", "header3"=>"value3", "header5"=>"value5", "header1"=>"value1", "header2"=>"value2"}
-


上面的答案都很好,但没有一个能在O(n)时间内完成操作。我认为可以通过将
结果
转换为临时哈希来提高理论性能和清晰度:

>> record_h = record.reduce(:merge)
=> {"header4"=>"value4", "header3"=>"value3", "header5"=>"value5", "header1"=>"value1", "header2"=>"value2"}
-


很不错的。逻辑在可读性方面有点混乱(根本不是你的错),但简洁性很好。虽然我会使用
键。找到{k | k=~/header/}
来代替
。首先
如果在每个
散列中键没有按此顺序排序
@engineersmnky,我同意你的可读性,这是我喜欢使用
排序方式
索引
。非常好。逻辑在可读性方面有点混乱(根本不是你的错),但简洁性很好。虽然我会使用
键。找到{k | k=~/header/}
代替
。首先
如果在每个
散列中键没有按此顺序排序
@enginersmnky,我同意您的可读性,这是我更喜欢使用
排序方式的主要原因,
索引
。请在新的StackOverflow问题中提出后续问题。接受以下原始问题的答案。请在新问题中提出后续问题。接受以下原始问题的答案。