मैं किसी सरणी से रिक्त तत्व कैसे निकालूं?


284

मेरे पास निम्न सरणी है

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]

मैं रिक्त तत्वों को सरणी से निकालना चाहता हूं और निम्नलिखित परिणाम चाहता हूं:

cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

क्या ऐसी कोई विधि है compactजो इसे बिना लूप के करेगी?

जवाबों:


501

ऐसा करने के कई तरीके हैं, एक है reject

noEmptyCities = cities.reject { |c| c.empty? }

आप उपयोग भी कर सकते हैं reject!, जो citiesजगह में संशोधित करेगा । यह या तो citiesइसके वापसी मूल्य के रूप में वापस आ जाएगा यदि यह कुछ अस्वीकार कर दिया, या nilयदि कोई अस्वीकृति नहीं हुई है। यदि आप सावधान नहीं हैं तो एक गोचा हो सकता है (टिप्पणियों में इसे इंगित करने के लिए निंजा08 के लिए धन्यवाद)।


227
या यदि आप अधिक कॉम्पैक्ट पसंद करते हैंcities.reject!(&:empty?)
नोबल

53
हम्म, क्यों नहीं cities.reject!(&:blank?)? empty?सरणियों के लिए है
निको

27
@ निको blank?केवल के माध्यम से उपलब्ध है ActiveSupport। स्टैंडर्ड रूबी का उपयोग करता है String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
माइकल कोहल

24
rejectसे बेहतर है reject!क्योंकि [].reject!(&:empty?)रिटर्न nil, [].reject(&:empty?)रिटर्न[]
konyak

17
अस्वीकार के साथ बाहर देखो!। अस्वीकार! यदि कोई परिवर्तन नहीं किए जाते हैं, तो nil वापस आ जाएगा। यदि आप कोई परिवर्तन नहीं किए जाने पर सरणी वापस करना चाहते हैं, तो धमाके के बिना अस्वीकार का उपयोग करें।
निक रेस

164
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

=> ["A", "B", "C"]

5
मैं शून्य मानों से बचने के लिए .reject (&: blank?) का उपयोग करना पसंद करूंगा
भाग 632

4
@ रैनगिली blank?एक अच्छा विकल्प है, लेकिन इसकी एक railsविधि है, और यह सवाल सादे के बारे में हैruby
स्वैप

83

यहाँ मेरे लिए क्या काम करता है:

[1, "", 2, "hello", nil].reject(&:blank?)

उत्पादन:

[1, 2, "hello"]

रूबी 2.3.1 पर मुझे NoMethodError मिलती है: "अपरिभाषित विधि` रिक्त? ' 1 के लिए: Fixnum "इसे निष्पादित करने की कोशिश कर रहा है।
टॉम

1
@ खाली है? एक रेल विशिष्ट विधि है। सादे माणिक के लिए ऐरे पर मौजूद नहीं है। आपको खाली इस्तेमाल करना पड़ेगा? या अपनी विधि लिखें।
jpgeek

@jpgeek स्पष्टीकरण के लिए धन्यवाद, जो परेशानी मुझे महसूस हो रही थी :blank?वह रेल-विशिष्ट है।
टॉम

क्योंकि NoMethodError: undefined method empty? for nil:NilClass, :blank? से बेहतर है:empty?
लेन

:blankसे बेहतर काम करता है :empty। क्योंकि के :emptyलिए काम नहीं करता हैnil
KBIIX

54

मेरी परियोजना में मैं उपयोग करता हूं delete:

cities.delete("")

5
सुरुचिपूर्ण! दुर्भाग्य से शेष सरणी वापस नहीं आती है, लेकिन बहुत ही धीमी
केविन

11
Array.delete काउंटर-सहज ज्ञान युक्त है। यह एक .delete (!) की तरह काम करता है अगर ऐसी कोई विधि मौजूद है। .Delete () विनाशकारी तरीके से सीधे सरणी पर संचालित होता है।
स्कार्वर

41

जब मैं इस तरह से एक सरणी को साफ करना चाहता हूं तो मैं इसका उपयोग करता हूं:

["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]

यह सभी रिक्त या शून्य तत्वों को हटा देगा।


1
दरअसल, द टिन मैन का जवाब बेहतर है क्योंकि यह ऐसी किसी भी चीज़ को हटा देगा जो ऑब्जेक्ट # रिक्त से मेल खाती है? यानी nil, "", "\ n", "", "\ n \ r", आदि स्वीकार किए गए उत्तर के विपरीत, यह रेल के बिना भी काम करेगा।
सुपरलाइनरी सेप

24

सबसे स्पष्ट

cities.delete_if(&:blank?)

यह nilमान और रिक्त स्ट्रिंग ( "") मान दोनों को निकाल देगा ।

उदाहरण के लिए:

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]

cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

विराम चिह्न हटाने और एक बृहदान्त्र को जोड़ने से "शहर: हटाएं यदि रिक्त है": D
clapp

2
रिक्त एक रूबी या रेल विधि है?
अर्नोल्ड रोआ

2
@AnnoldRoa यह एक रेल विधि है।
पॉलमेस्ट

1
क्या होगा अगर खाली स्ट्रिंग के बीच एक जगह है?
स्टीवन एगुइलर

@StevenAguilar एक अंतरिक्ष को लंबाई 1 माना जाता है (क्योंकि एक स्थान एक वर्ण है)। "" .बलक? => झूठी
phlegx

23

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

puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]

4
यह चालाक है, और "" वापस नहीं करता है! यह एक बेहतरीन लिल ट्रिक है।
सीन लार्किन

2
["काठमांडू", "पोखरा", "", "धरन", "बुटवल"] - [""] - इस मामले में काम नहीं करेगा
अज़ाहोंगिर

2.0.0-p247: 001> ["काठमांडू", "पोखरा", "", "धरान", "बुटवल"] - ["" => ["काठमांडू", "पोखरा", "धरण", "बुटवल "] लगता है मेरे लिए काम करता है। आपको क्यों लगता है कि यह काम नहीं करता है?
1

1
@ रीलों, इस मामले में रिक्त स्ट्रिंग खाली नहीं है। इसके भीतर एक ही स्थान है।
चंद्रवंशी

1
@Chandranshu मैं अलग करने के लिए भीख माँगती हूँ। मैंने पाठ को एक संपादक में कॉपी और पेस्ट किया और पाया कि आपके द्वारा सुझाए गए उद्धरणों के बीच कोई स्थान नहीं है। अगर वहाँ था, तो घटाना ["", ""] काम करेगा। सुपरम्लिनरी का उदाहरण समान है और साथ ही काम करता है। मूल अनुरोध "रिक्त तत्वों" को हटाने के लिए था "तत्व जो कि रिक्त हैं", और उदाहरण के रिक्त तत्व को ओपी में "" के रूप में दिखाया गया था।
1

17

उपयोग करें reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

13
या, aNoble जैसा कि ऊपर बताया, reject(&:empty?)
म्यू बहुत छोटा है

ब्लॉक फॉर्मेट की तुलना में सिम्बोल को 1.8.7 पर धीमा किया जाता है। यह 1.9.2 में जो मैंने देखा है उससे बराबर है
Caley Woods

यह अच्छा है क्योंकि यह किसी भी तत्व को हटा देगा जो ऑब्जेक्ट # खाली से मेल खाता है? जैसे। "\ n" "", शून्य, "\ n \ n \ n", आदि ...
superluminary

5
nil.empty?वरदान तोड़ो!
नवेद

1
@AllenMaxwell @Naveed अपने सरणी शून्य तत्व है, तो पूर्व में होना reject(&:empty?)के साथ compactजैसे[nil, ''].compact.reject(&:empty?)
scarver2

14
cities.reject! { |c| c.blank? }

आपके द्वारा उपयोग किए blank?जाने का empty?कारण यह है कि रिक्त शून्य, रिक्त तार और सफेद स्थान को पहचानता है। उदाहरण के लिए:

cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }

अभी भी लौटेगा:

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

और बुला empty?पर " "इच्छा वापसी falseहै, जो आप शायद होना चाहता हूँ true

नोट: blank?केवल रेल के माध्यम से पहुँचा जा सकता है, रूबी केवल समर्थन करता है empty?


11

यदि आप रेल की दुनिया में हैं, तो पहले से ही बहुत सारे उत्तर हैं, लेकिन यहाँ एक और तरीका है:

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?

4
present?से आता है ActiveSupport। इसमें कोई रेल टैग नहीं है और एक विधि के लिए अतिरिक्त रत्न की आवश्यकता अत्यधिक लगती है।
माइकल कोहल

1
@ नहीं, आपको इसे "यदि आप आरओआर का उपयोग कर रहे हैं" के साथ पेश करना चाहिए। मैं इसे कम नहीं करूंगा क्योंकि यह अभी भी शुरुआती लोगों के लिए उपयोगी जानकारी है।
पिक्सेलरथ

9

इसे प्राप्त करने के लिए यहां एक और तरीका है

हम के presenceसाथ उपयोग कर सकते हैंselect

cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]

cities.select(&:presence)

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

2
इसके लिए शुक्रिया। " "मेरे सरणी में कुछ तत्व थे जिन्हें अस्वीकार पद्धति से नहीं हटाया गया था। आपका तरीका निकाला nil ""या " "आइटम।
Iamse7en

8

यहाँ एक समाधान है यदि आप अपने सरणी में मिश्रित प्रकार हैं:

[nil,"some string here","",4,3,2]

उपाय:

[nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}

आउटपुट:

=> ["some string here", 4, 3, 2]

5

आप यह कोशिश कर सकते हैं

 cities.reject!(&:empty?)

3
शायद u का मतलब हैcities.reject!(&:blank?)
xguox

2
 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? } 

हटाना और व्यवस्था करना एक महंगा ऑपरेशन होगा
Naveed


0

एक अन्य विधि:

> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]

-2

के साथ एक सख्त के साथ अद्यतन करें join&split

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split

परिणाम होगा:

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

ध्यान दें: यह रिक्त स्थान वाले शहर के साथ काम नहीं करता है


2
बहुत जोखिम भरा लग रहा है!
मुसुंदर

1
यह निश्चित रूप से विफल हो जाएगा यदि आपके पास "न्यूयॉर्क" या "नौजोजी अक्मीने" :) जैसे शहर हैं
पेट्रास एल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.