/ / मानकों के आधार पर एक हैश समूहबद्ध रूबी - रूबी, सरणी, हैश

मानकों के आधार पर एक हैश को समूहीकृत करना रूबी - रूबी, सरणी, हैश

तो मेरे पास निम्नलिखित है

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

मैं समूहों में यह विभाजन प्राप्त करना चाहता हूं,

इसलिए प्रत्येक समूह आइटम पर शुरू होता है और आइटम 3 पर समाप्त होता है, आइटम 2 गायब हो सकता है

आदर्श मैं चाहता हूँ

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

तो एक वास्तविक उदाहरण में:

एक 3 आइटम पोस्ट करने की आवश्यकता है लेकिन मुझे एक्सेल स्प्रैडशीट से एक सरणी मिलती है

name: blah
id: blah
color: blah

name: blah
date: blah
size: blah

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

मुझे प्रत्येक रिकॉर्ड पोस्ट करने की ज़रूरत है, बशर्ते मेरे ऊपर एक सरणी है, किसी दिए गए हैश तत्व कुंजी फ़ील्ड पर सरणी को समूह / विभाजित करने का कोई तरीका है?

उत्तर:

जवाब के लिए 0 № 1

एक कार्यात्मक दृष्टिकोण, सूचकांक प्राप्त करें जहां :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 के लिए 1

यदि आपका डेटा डबल लाइन द्वारा वास्तव में सीमित हैतोड़ें, आपको पैराग्राफ द्वारा पहले विभाजित करके लाभ प्राप्त करना चाहिए, फिर रेखा से, फिर कोलन द्वारा। तब आपको डेटा खोने के बारे में चिंता करने की ज़रूरत नहीं है और अंधेरे से कुंजी / मूल्य जोड़े भर सकते हैं।


जवाब के लिए 0 № 3

इसे इस्तेमाल करे

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 № 4

रूबी की शुद्ध अजीबता:

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