2012-02-01 15 views
14

में कुंजियों की सरणी हटाएं मैं हैश में कुंजी की सरणी हटाने के बारे में कैसे जाउंगा? उदाहरण के लिए, आप कॉल कर सकते हैं:रूबी हैश

hash_array.delete(some_key) 

लेकिन मैं यह कैसे कर सकते हैं: अनावश्यक सरणी के माध्यम से पाशन के बिना

hash_array.delete([key1,key2,key3,...]) 

+0

में संग्रहीत आप एक सरणी तो आप किसी भी मामले में यह माध्यम से पुनरावृति जाएगा है, तो है। शायद आपको इन चाबियों को सरणी में स्टोर करने की आवश्यकता नहीं है, लेकिन उन्हें तुरंत हटा दें। – megas

उत्तर

14

आप चाबियों का एक सरणी से अधिक पुनरावृति और उनमें से हर किसी को नष्ट कर सकते हैं:

[key1, key2, key3].each { |k| some_hash.delete k } 

किसी भी बेहतर समाधान याद नहीं आ रहा।

+0

मैं लूप से दूर रहने की कोशिश कर रहा हूं क्योंकि वे धीमे हैं और यह कोड समय संवेदनशील है। –

+1

मैं देखता हूं, लेकिन यदि आप चाबियों की एक सरणी से निपटते हैं तो आपको इसे फिर से चालू करना होगा। आपके मामले में हैश और सरणी के आकार क्या हैं? –

+0

मुझे वास्तव में कुंजी की सरणी के माध्यम से पुन: प्रयास करने की आवश्यकता नहीं है, बस हैश में उन कुंजी को हटाने की आवश्यकता है। हैश में लगभग 20,000 आइटम हैं लेकिन इसे हर बार अलग-अलग वस्तुओं के साथ कई बार लूप करना पड़ता है। –

2

हो सकता है कि यह एक तरीका है

class Hash 
    def delete_by_keys *keys 
    keys.each{|k| delete(k)} 
    end 
end 

hash_array.delete_by_keys(key1,key2,..) 
+0

उपयोगी हो सकता है। धन्यवाद। –

+1

'' key.each''' '' key.each''' '' key.each''' बदले गए मान सरणी को हटा देता है। उपयोगी। – kuboon

10

बनाने के लिए लायक है आप Hash#delete_if इस्तेमाल करने की कोशिश कर सकते हैं:

delete_if HSH जिसके लिए ब्लॉक सही का आकलन से हर कुंजी-मान पेयर हटा देता है।

array_hash.delete_if { |key, _| [key1, key2, key3].include? key } 

अद्यतन आप चाबियों का सरणी पर पुनरावृति नहीं करना चाहते हैं, तो आप Set बजाय Array उपयोग कर सकते हैं (Set के बाद से Hash का उपयोग करता भंडारण include? के रूप में हे है (1)) :

require 'set' 
keys = [key1,key2,key3].to_set 
array_hash.delete_if { |key, _| keys.include? key } 
+0

+1। मैं बस इसे जोड़ने जा रहा था। बेशक, यह वस्तुओं के माध्यम से भी पुनरावृत्त करता है (यहां तक ​​कि कई बार)। –

+0

यदि हैश का आकार सरणी के आकार से बड़ा तरीका है तो यह दृष्टिकोण किसी सरणी पर पुनरावृत्ति से कम कुशल है। –

+1

@ केएल -7, सहमत हैं, कुछ कोड को अनुकूलित करने से पहले हमेशा पेनफॉर्मेंस बेंचमार्क करना आवश्यक है, माप के बिना अनुकूलन निष्पादन समय और स्मृति खपत में वृद्धि कर सकता है। मैं इस तरह के कोड अनुकूलित करने के लिए परेशान नहीं होगा। ओपी में कई विकल्प हैं :) –

0

सक्रिय समर्थन (रेल का हिस्सा) इस तरह लागू करता है, जैसा कि हैश # को छोड़कर और हैश # छोड़कर!

def except!(*keys) 
    keys.each { |key| delete(key) } 
    self 
end 

http://apidock.com/rails/v4.0.2/Hash/except%21

1

देखें आप प्राप्त कर सकते हैं आप "सूचक ऑपरेटर" के साथ क्या करना चाहते हैं क्या (*)।

hash_array.delete *[key1,key2,key3,...] 

यह प्रत्येक कुंजी को एक अलग तर्क के रूप में पास करने के बराबर है।

+3

बहुत अच्छा लग रहा है लेकिन काम नहीं करता .. –

+1

मेरे लिए भी काम नहीं करता – traHfo

8

यह वही है जो आप खोज रहे हैं ... आप इसे अनावश्यक रूप से सरणी के बिना लूप किए बिना ऐसा कर सकते हैं।

keys_to_delete = [key1, key2, key3] 
hash_array.except!(*keys_to_delete) 

परिणाम hash_array

+5

यह रेल का हिस्सा है, रूबी नहीं। – sokkyoku

संबंधित मुद्दे