基于ruby参数对哈希进行分组

时间:2012-09-08 22:00:25

标签: ruby arrays hash

所以我有以下

[{:item=>"x"}, {:item2=>"x"}, {:item3=>"x"}, {:item=>"x"},{:item3=>"x"}]

我想把这个分成小组,

所以每个小组从项目开始到项目3结束,项目2可能会丢失

理想情况下我想要

{:item=>"x",:item2=>"x",:item3=>"x"} & {:item=>"x",:item3=>"x"}

所以在一个真实的例子中:

需要发布3个项目,但我从excel电子表格中获取了一个数组

name: blah
id: blah
color: blah

name: blah
date: blah
size: blah

name: blah
id: blah
date: blah
color: blah
size: blah

我需要发布每条记录,因为我有一个像上面那样的数组是否有某种方法可以在给定的哈希元素键字段上对数组进行分组/拆分?

4 个答案:

答案 0 :(得分:1)

如果您的数据确实是由双线中断分隔的,那么您应该首先按段落,然后按行,然后按冒号分割。然后你不必担心丢失数据,可以盲目地填写键/值对。

答案 1 :(得分:0)

一种功能方法,获取:item所在的索引并将其拆分:

hs = [{:item=>"x"}, {:item2=>"x"}, {:item3=>"x"}, {:item=>"x"},{:item3=>"x"}]
indexes = hs.map.with_index { |h, i| i if h.first[0] == :item }.compact
(indexes + [hs.size]).each_cons(2).map { |from, to| hs[from...to].reduce(:merge) }
#=> [{:item=>"x", :item2=>"x", :item3=>"x"}, {:item=>"x", :item3=>"x"}]

如果您更喜欢更具说明性的方法(我这样做),请在扩展库中添加一些抽象,以便您可以编写:

indexes = hashes.find_indexes { |h| h.first[0] == :item }
hashes.split_at(*indexes.drop(1)).map { |hs| hs.reduce(:merge) }

答案 2 :(得分:0)

试试这个

input = [{:item=>"x"}, {:item2=>"x"}, {:item3=>"x"}, {:item=>"x"},{:item3=>"x"}]

res = []
input.each do |element|
  if element.keys.first == :item
    res << element
  else
    res.last.merge! element
  end
end

puts puts res.inspect # => [{:item=>"x", :item2=>"x", :item3=>"x"}, {:item=>"x", :item3=>"x"}]

答案 3 :(得分:-2)

Ruby的纯粹真谛:

arr = [{:item=>"x"}, {:item2=>"x"}, {:item3=>"x"}, {:item=>"x"}, {:item3=>"x"}]
arr.each_slice(3).map { |a| a.inject(&:merge) }
=> [{:item=>"x", :item2=>"x", :item3=>"x"}, {:item=>"x", :item3=>"x"}]