আমি কীভাবে অ্যারে থেকে ফাঁকা উপাদানগুলি সরিয়ে ফেলব?


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?)
aNoble

53
এইচএম, কেন না cities.reject!(&:blank?)? empty?অ্যারেগুলির জন্য
নিকো

27
@ নিকো blank?কেবলমাত্র এর মাধ্যমে উপলব্ধ ActiveSupport। স্ট্যান্ডার্ড রুবি ব্যবহার করে String#empty?: রুবি- ডক.আর.আর.কোর্স
মাইকেল কোহল

24
rejectবেশী ভালো reject!কারণ [].reject!(&:empty?)আয় nil, [].reject(&:empty?)আয়[]
konyak

17
প্রত্যাখ্যান সঙ্গে নজর রাখুন !. প্রত্যাখ্যান! অ্যারেতে কোনও পরিবর্তন না করা হলে শূন্যস্থান ফিরে আসবে। যদি কোনও পরিবর্তন না করা হয় আপনি যদি অ্যারেটি ফিরিয়ে দিতে চান তবে ব্যাং ছাড়াই কেবল প্রত্যাখ্যান করুন।
নিক রেস

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

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

5
নীল মানগুলি এড়াতে আমি .রেজেক্ট (এবং: ফাঁকা?) ব্যবহার করতে পছন্দ করব
রান 2২২

4
@ রানগালিলি blank?একটি ভাল পছন্দ তবে এটি একটি railsপদ্ধতি, এবং এই প্রশ্নটি সমভূমি সম্পর্কিতruby
অদলবদল

83

আমার জন্য যা কাজ করে তা এখানে:

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

আউটপুট:

[1, 2, "hello"]

রুবি ২.৩.১-এ আমি NoMethodError পাই: "অপরিজ্ঞাত পদ্ধতি` ফাঁকা? ' 1 এর জন্য: ফিক্সনাম "এটি কার্যকর করার চেষ্টা করছে।
টম

1
@ টম ফাঁকা? একটি রেল নির্দিষ্ট পদ্ধতি। সরল রুবির জন্য অ্যারে তে বিদ্যমান নেই। আপনি খালি ব্যবহার করতে হবে? বা আপনার নিজস্ব পদ্ধতি লিখুন।
jpgeek

@jpgeek স্পষ্টতার জন্য ধন্যবাদ, বুঝতে পেরেছিলাম যে সমস্যাটি ছিল রিয়েল :blank?-নির্দিষ্ট।
টম

কারণ NoMethodError: undefined method empty? for nil:NilClass, এর :blank? চেয়ে ভাল:empty?
লেন

:blankচেয়ে ভাল কাজ করে :empty। কারণ :emptynil
কেবিআইআইএক্স

54

আমার প্রকল্পে আমি ব্যবহার delete:

cities.delete("")

5
মার্জিত! দুর্ভাগ্যক্রমে অবশিষ্ট অ্যারেটি ফিরিয়ে দেয় না, তবে বেশ চটুল
কেভিন

11
অ্যারে.ডিলেট হ'ল পাল্টা স্বজ্ঞাত। এটি একটি। মুছে ফেলার মতো পরিচালনা করে! () এরূপ পদ্ধতি যদি বিদ্যমান থাকে। .Delete () অ্যারেতে একটি ধ্বংসাত্মক উপায়ে সরাসরি পরিচালনা করে।
স্কার্ভার 2

41

যখন আমি এটির মতো একটি অ্যারে পরিস্কার করতে চাই তখন:

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

এটি সমস্ত ফাঁকা বা শূন্য উপাদান মুছে ফেলবে।


1
আসলে, টিন ম্যানের উত্তরটি আরও ভাল কারণ এটি # অবজেক্টের সাথে মেলে এমন কোনও কিছুই মুছে ফেলবে? যেমন শূন্য, "", "\ n", "", "\ n \ r", ইত্যাদি গ্রহণযোগ্য উত্তরের বিপরীতে, এটিও ব্যর্থতা ছাড়াই কাজ করবে।
সুপারলুমিনিয়ার

24

সর্বাধিক স্পষ্ট

cities.delete_if(&:blank?)

এটি উভয় nilমান এবং খালি স্ট্রিং ( "") মান মুছে ফেলবে ।

উদাহরণ স্বরূপ:

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

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

বিরামচিহ্ন অপসারণ এবং একটি কোলন যুক্ত করা "শহরগুলি: ফাঁকা হলে মুছুন" দেয়: ডি
তালি

2
ফাঁকা একটি রুবি বা রেল পদ্ধতি?
আর্নল্ড রোয়া

2
@ আর্নল্ডরোয়া এটি একটি রেলস পদ্ধতি।
পলমেষ্ট

1
যদি খালি স্ট্রিংয়ের মধ্যে কোনও স্থান থাকে?
স্টিভেন আগুইলার

@ স্টিভেনএগিলার একটি স্থানকে দৈর্ঘ্য 1 হিসাবে বিবেচনা করা হয় (কারণ একটি স্থান হ'ল একটি চরিত্র)। "" .ব্ল্যাঙ্ক? => মিথ্যা
ফ্লেক্স

23

এটা চেষ্টা কর:

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

4
এটি চতুর, এবং ফিরে "" না! এটি একটি দুর্দান্ত লিল কৌশল।
শন লারকিন

2
["কাঠমান্ডু", "পোখারা", "", "ধরণ", "বুটওয়াল"] - [""] - এই ক্ষেত্রে কাজ করবে না
আজানগীর

2.0.0-p247: 001> ["কাঠমান্ডু", "পোখরা", "", "ধরন", "বুটওয়াল"] - [""] => ["কাঠমান্ডু", "পোখারা", "ধরন", "বাটওয়াল" "] আমার জন্য কাজ করে বলে মনে হয়. আপনি কেন মনে করেন এটি কাজ করে না?
রেলস

1
@ রেলস, এই ক্ষেত্রে ফাঁকা স্ট্রিংটি খালি নয়। এটির মধ্যে এটির একটি একক স্থান রয়েছে।
চন্দ্রনশু

1
@ চন্দ্রনশু আমি আলাদা হতে অনুরোধ করছি। আমি কোনও সম্পাদককে পাঠ্যটি অনুলিপি করে আটকালাম এবং আপনার পরামর্শ অনুসারে উদ্ধৃতিগুলির মধ্যে কোনও স্থান নেই। যদি সেখানে থাকে তবে ["", ""] বিয়োগ করা কাজ করবে। সুপারলুমিনিয়ার উদাহরণটি একই রকম এবং পাশাপাশি কাজ করে। আসল অনুরোধটি হ'ল "ফাঁকা উপাদানগুলি" "ফাঁকা উপাদানগুলি নয়" সরানো, এবং উদাহরণটি ফাঁকা উপাদানটিকে ওপিতে "" হিসাবে দেখানো হয়েছিল।
রেলস

17

ব্যবহার reject:

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

13
বা, উপরে উল্লেখযোগ্য হিসাবে নোবল reject(&:empty?),।
মিউ খুব ছোট

প্রতীক থেকে প্রোকটি ব্লক ফর্ম্যাটের চেয়ে 1.8.7 এ ধীরে ধীরে। এটি আমি 1.9.2 এ যা দেখেছি তার থেকে সমান
উডস

এটি ভাল কারণ এটি # টির সাথে মিলবে এমন কোনও উপাদান মুছে ফেলবে # খালি?, যেমন। "\ n", "", শূন্য, "\ n \ n \ n", ইত্যাদি ...
অতিপরিচয়তা

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
হতে পারে আপনি বোঝাতে চেয়েছিলেনcities.reject!(&:blank?)
xguox

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

মুছে ফেলা এবং ব্যবস্থা করা ব্যয়বহুল ক্রিয়াকলাপ হবে
নাভিদ


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
আপনার যদি "নিউ ইয়র্ক" বা "নওজোজি আকামিন" এর মতো শহর থাকে তবে এটি অবশ্যই ব্যর্থ হবে :)
পেট্রাস এল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.