-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

データが実際に二重改行で区切られている場合は、最初に段落ごとに分割し、次に行ごとに分割し、次にコロンで分割することを利用する必要があります。そうすれば、データの欠落を心配する必要がなくなり、やみくもにキーと値のペアを入力できます。

于 2012-09-08T22:42:03.370 に答える
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 に答える
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 に答える
-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 に答える