ฉันมีอาร์เรย์ของวัตถุใน Ruby on Rails ฉันต้องการจัดเรียงอาร์เรย์ตามแอตทริบิวต์ของวัตถุ เป็นไปได้ไหม?
ฉันมีอาร์เรย์ของวัตถุใน Ruby on Rails ฉันต้องการจัดเรียงอาร์เรย์ตามแอตทริบิวต์ของวัตถุ เป็นไปได้ไหม?
คำตอบ:
ฉันแนะนำให้ใช้ sort_by แทน:
objects.sort_by {|obj| obj.attribute}
โดยเฉพาะอย่างยิ่งถ้าอาจมีการคำนวณแอตทริบิวต์
หรือแนวทางที่กระชับกว่านี้:
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(เช่นความเร็ว ฯลฯ )
ใช่การใช้Array#sort!
สิ่งนี้เป็นเรื่องง่าย
myarray.sort! { |a, b| a.attribute <=> b.attribute }
<=>
? คุณได้รับข้อผิดพลาดประเภทใด ฯลฯ อาการคลื่นไส้โฆษณา กล่าวอีกนัยหนึ่งเราต้องการรายละเอียดมากกว่า "แต่ไม่มีโชคสำหรับฉัน"
sort
หากคุณต้องการรักษาต้นฉบับและกำหนดผลลัพธ์ให้กับวัตถุอื่น มิฉะนั้นให้ใช้ตัวแปรแทนที่, sort!
. ในความเป็นจริงsort
โทรsort!
ภายในหลังจากคัดลอกวัตถุต้นฉบับ
sort!
จะใช้งานได้ดีและ (!) จะทำสิ่งเดียวกันกับที่คุณเขียนไว้เสมอ
ลำดับจากน้อยไปมาก:
objects_array.sort! { |a, b| a.attribute <=> b.attribute }
หรือ
objects_array.sort_by{ |obj| obj.attribute }
ลำดับจากมากไปหาน้อย:
objects_array.sort! { |a, b| b.attribute <=> a.attribute }
หรือ
objects_array.sort_by{ |obj| obj.attribute }.reverse
ในกรณีที่คุณต้องการจัดเรียงตามแอตทริบิวต์สองรายการโดยที่หนึ่งมีความสำคัญมากกว่าอันดับที่สอง (หมายถึงการพิจารณาอาร์กิวเมนต์ที่สองเฉพาะในกรณีที่อาร์กิวเมนต์แรกเท่ากัน) คุณอาจทำเช่นนี้
myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
หรือในกรณีของอาร์เรย์อาร์เรย์
myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }
คุณสามารถจัดเรียงคลาสใดก็ได้โดยการแทนที่ <=> วิธีการ:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(other)
@last_name + @first_name <=> other.last_name + other.first_name
end
end
ตอนนี้อาร์เรย์ของวัตถุบุคคลจะเรียงลำดับได้ใน last_name
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
Array # sort ทำงานได้ดีดังที่โพสต์ไว้ด้านบน:
myarray.sort! { |a, b| a.attribute <=> b.attribute }
แต่คุณต้องตรวจสอบให้แน่ใจว่าได้ใช้<=>
ตัวดำเนินการสำหรับแอตทริบิวต์นั้น หากเป็นประเภทข้อมูลเนทีฟ Ruby ก็ไม่เป็นปัญหา มิฉะนั้นให้เขียนว่าคุณเป็นเจ้าของการนำไปใช้งานที่ส่งกลับค่า -1 ถ้า a <b, 0 ถ้ามันเท่ากันและ 1 if a> b
สง่างามยิ่งขึ้นobjects.sort_by(&:attribute)
คุณสามารถเพิ่มได้.reverse
หากคุณต้องการเปลี่ยนลำดับ
@model_name.sort! { |a,b| a.attribute <=> b.attribute }
sort
เมื่อคุณจัดเรียงวัตถุที่ไม่สามารถเปรียบเทียบได้โดยตรง sort_by
ถ้าคุณมีคุณลักษณะการเข้าถึงหรือการทำการคำนวณที่จะได้รับความคุ้มค่าในการเปรียบเทียบการใช้งาน มันจะเร็วกว่ามาก
objects.sort_by(&:attribute)