/ / zoskupovanie hash na základe parametrov ruby ​​- ruby, polia, hash

zoskupovanie hash na základe parametrov ruby ​​- ruby, polia, hash

takže mám nasledujúce

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

Chcem rozdeliť túto skupinu na skupiny,

takže každá skupina začína položkou a končí v položke 3, položka 2 môže chýbať

v ideálnom prípade chcem

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

Takže v skutočnom príklade:

Tri položky je potrebné zverejniť, ale získam pole z tabuľky programu Excel

name: blah
id: blah
color: blah

name: blah
date: blah
size: blah

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

Potrebujem zadať každý záznam, pretože mám pole, ako je vyššie, existuje nejaký spôsob, ako zoskupiť / rozdeliť pole na danom poli kľúča kľúča?

odpovede:

0 pre odpoveď č. 1

Funkčný prístup, získajte indexy, kde :itemsú tam rozdelené:

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"}]

Ak dávate prednosť deklaratívnejšiemu prístupu (ja), pridajte do svojej knižnice rozšírení abstrakcie, aby ste mohli napísať:

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

1 pre odpoveď č. 2

Ak sú vaše údaje skutočne vymedzené dvojitým riadkomprestávka by ste mali využiť tým, že rozdeľujete najprv odsek, potom po riadku a potom dvojbodkou. Potom sa nemusíte obávať chýbajúcich údajov a môžete slepko vyplniť páry kľúč / hodnota.


0 pre odpoveď č. 3

skúste to

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"}]

-2 pre odpoveď č. 4

Pure awesomness of 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"}]