উত্তর:
Array#uniq
একটি ব্লক ব্যবহার করুন :
@photos = @photos.uniq { |p| p.album_id }
require 'backports'
:-)
@photos.uniq &:album_id
uniq_by
আপনার প্রকল্পে অ্যারেতে পদ্ধতিটি যুক্ত করুন । এটি সাথে সাদৃশ্য দ্বারা কাজ করে sort_by
। সুতরাং uniq_by
হয় uniq
যেমন sort_by
হয় sort
। ব্যবহার:
uniq_array = my_array.uniq_by {|obj| obj.id}
রুপায়ণ:
class Array
def uniq_by(&blk)
transforms = []
self.select do |el|
should_keep = !transforms.include?(t=blk[el])
transforms << t
should_keep
end
end
end
মনে রাখবেন যে এটি আপনার বর্তমানের জায়গায় পরিবর্তনের পরিবর্তে একটি নতুন অ্যারে প্রদান করে। আমরা একটি লিখিনিuniq_by!
পদ্ধতি লিখিনি তবে আপনি চাইলে এটি যথেষ্ট সহজ হওয়া উচিত।
সম্পাদনা: উপজাতীয়গণ উল্লেখ করেছেন যে বাস্তবায়নটি হ'ল (এন ^ 2)। এর চেয়ে ভাল কিছু হবে (অদৃশিত) ...
class Array
def uniq_by(&blk)
transforms = {}
select do |el|
t = blk[el]
should_keep = !transforms[t]
transforms[t] = true
should_keep
end
end
end
এটি ডাটাবেস স্তরে করুন:
YourModel.find(:all, :group => "status")
আপনি এই কৌশলটি অ্যারে থেকে বিভিন্ন বৈশিষ্ট্য উপাদান দ্বারা অনন্য নির্বাচন করতে ব্যবহার করতে পারেন:
@photos = @photos.uniq { |p| [p.album_id, p.author_id] }
আমি মূলত select
অ্যারেতে পদ্ধতিটি ব্যবহার করার পরামর্শ দিয়েছিলাম । বুদ্ধিমান:
[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
আমাদের দেয় [2,4,6]
ফিরিয়ে
আপনি যদি এই জাতীয় প্রথম জিনিসটি চান তবে ব্যবহার করুন detect
।
[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
আমাদের দেয় 4
।
যদিও আপনি এখানে যাচ্ছেন সে সম্পর্কে আমি নিশ্চিত নই।
যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি, তবে কোনও বৈশিষ্ট্য পৃথক কিনা তা নির্ধারণ করার জন্য আমি মার্শাল বস্তুগুলির সাথে তুলনা করার আধা-হ্যাকি পদ্ধতির সাহায্যে এই সমস্যাটি মোকাবিলা করেছি। নিম্নলিখিত কোডের শেষে ইঞ্জেকশনটি উদাহরণ হতে পারে:
class Foo
attr_accessor :foo, :bar, :baz
def initialize(foo,bar,baz)
@foo = foo
@bar = bar
@baz = baz
end
end
objs = [Foo.new(1,2,3),Foo.new(1,2,3),Foo.new(2,3,4)]
# find objects that are uniq with respect to attributes
objs.inject([]) do |uniqs,obj|
if uniqs.all? { |e| Marshal.dump(e) != Marshal.dump(obj) }
uniqs << obj
end
uniqs
end
সর্বাধিক মার্জিত উপায় আমি খুঁজে পেয়েছি Array#uniq
একটি ব্লক ব্যবহার করে একটি স্পিন অফ
enumerable_collection.uniq(&:property)
… এটি আরও ভাল পড়া!
একটি ব্লক সহ অ্যারে # ইউনিিক ব্যবহার করুন :
objects.uniq {|obj| obj.attribute}
বা আরও সংক্ষিপ্ত পদ্ধতির:
objects.uniq(&:attribute)
রেলগুলিরও একটি #uniq_by
পদ্ধতি রয়েছে।
আমি জ্যামাহ এবং হেডের উত্তরগুলি পছন্দ করি। কিন্তু তারা অ্যারে অর্ডার সংরক্ষণ করে? এগুলি রুবির পরবর্তী সংস্করণগুলিতে হতে পারে যেহেতু ভাষার নির্দিষ্টকরণে কিছু হ্যাশ সন্নিবেশ-ক্রম সংরক্ষণের প্রয়োজনীয়তা রয়েছে তবে এখানে একটি অনুরূপ সমাধান যা আমি পছন্দ করি না কেন অর্ডার সংরক্ষণ করে ব্যবহার করতে চাই।
h = Set.new
objs.select{|el| h.add?(el.attr)}
অ্যাক্টিভসপোর্ট বাস্তবায়ন:
def uniq_by
hash, array = {}, []
each { |i| hash[yield(i)] ||= (array << i) }
array
end
এখন আপনি যদি বৈশিষ্ট্যটির মানগুলি বাছাই করতে পারেন তবে এটি করা যেতে পারে:
class A
attr_accessor :val
def initialize(v); self.val = v; end
end
objs = [1,2,6,3,7,7,8,2,8].map{|i| A.new(i)}
objs.sort_by{|a| a.val}.inject([]) do |uniqs, a|
uniqs << a if uniqs.empty? || a.val != uniqs.last.val
uniqs
end
এটি একটি 1-গুণাবলীর অনন্য জন্য, তবে একই জিনিস ডাব্লু / লিক্সোগ্রাফিকাল সাজান ...