-1

所以我有以下

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

我想把这个分成几组,

所以每个组从 item 开始并在 item3 结束,item2 可能会丢失

理想情况下我想要

{: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

4 回答 4

1

如果您的数据确实由双换行符分隔,您应该先按段落,然后按行,然后按冒号来利用。那么你就不用担心数据丢失了,可以盲目的填写key/value对。

于 2012-09-08T22:42:03.370 回答
0

一种功能方法,获取 s 所在的索引并在那里: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) }
于 2012-09-08T22:30:34.213 回答
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"}]
于 2012-09-08T22:39:21.873 回答
-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"}]
于 2012-09-08T22:39:47.003 回答