lodash เรียงหลายคอลัมน์เรียงจากมากไปน้อย


151

มีวิธีการที่ดีในการจัดเรียงอาร์เรย์ของวัตถุตามคุณสมบัติหลายประการ:

var data = _.sortBy(array_of_objects, ['type', 'name']);

อย่างไรก็ตามนั่นเป็นเพียงการเรียงลำดับจากน้อยไปมาก มีวิธีที่สะดวกในการกำหนดทิศทางต่อคอลัมน์หรือไม่? เช่น

var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);

คำตอบ:


330

ตั้งแต่lodash 3.5.0คุณสามารถใช้sortByOrder (เปลี่ยนชื่อorderByใน v4.3.0):

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);

ตั้งแต่เวอร์ชัน 3.10.0คุณสามารถใช้ซีแมนทิกส์มาตรฐานสำหรับการสั่งซื้อ (asc, desc):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);

ในรุ่น 4ของ lodash วิธีนี้ได้ถูกเปลี่ยนชื่อorderBy โดย :

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);

7
สำหรับข้อมูลของคุณฟังก์ชั่นนี้ได้ถูกเปลี่ยนชื่อเป็น _.orderBy ( lodash.com/docs#orderBy ) ใน Lodash ตั้งแต่ 4.3.0 ฟังก์ชั่นการเรียงลำดับปกติเรียกว่า _.sortBy ( lodash.com/docs#sortBy )
Nidhin David

2
ฉันได้รับ_.sortByOrder is not a functionในเวอร์ชั่นล่าสุดของ lodash
chovy

66
ทำไม lodash ทำการเปลี่ยนชื่อฟังก์ชั่นต่อไป?
Kenny Worden

13
, ['asc', 'desc']ส่วนหนึ่งเป็นเพียงการละเว้นสำหรับฉันกับ lodash@4.17.10 ทุกอย่างเรียงจากน้อยไปมาก
maninak

4
@maninak _.sortByนี้สำหรับ ลอง_.orderByแทน หวังว่านี่จะช่วยได้
pcasme

45

คุณสามารถใช้งานได้ตลอดเวลา Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();

ฮ่าฮ่าฉลาด สำหรับการเรียงลำดับตัวเลขจากน้อยไปมาก (Lodash ค่าเริ่มต้นจากมากไปหาน้อย) ฉันใช้สิ่งนี้: _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
ในขณะที่ดีพอสำหรับบางกรณีผลของสิ่งนี้คือการเรียงลำดับจากมากไปน้อยในคอลัมน์ BOTH ซึ่งไม่ใช่คำถามที่ถาม
Inkling

กรุณาแนะนำคำตอบ? stackoverflow.com/questions/62611489/…
reacg garav

14

เป็นที่น่าสังเกตว่าถ้าคุณต้องการเรียงลำดับคุณสมบัติพิเศษจากมากไปน้อยคุณไม่ต้องการผนวก. reverse () ท้ายที่สุดเพราะจะทำให้เรียงลำดับจากมากไปน้อย

หากต้องการเรียงลำดับจากมากไปน้อยให้โยงประเภทของคุณจากน้อยที่สุดไปหาสำคัญที่สุดโดยเรียก. reverse () หลังจากแต่ละประเภทที่คุณต้องการเรียงจากมากไปน้อย

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()

เนื่องจากการเรียงลำดับของ _ เป็นการเรียงที่เสถียรคุณสามารถโยงและเรียงลำดับย้อนกลับได้อย่างปลอดภัยเนื่องจากหากสองรายการมีค่าเดียวกันสำหรับคุณสมบัติ

ข้อมูลมากกว่านี้


หากคุณมีตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็นไม่ต้องแสดงความคิดเห็น แม้ว่าคุณจะได้คำตอบที่แท้จริงจากเนื้อหนังซึ่งเป็นสิ่งที่ดี แต่คุณไม่จำเป็นต้องพูดถึงความจริงนั้น
ArtOfCode

กรุณาแนะนำคำตอบ? stackoverflow.com/questions/62611489/…
reacg garav

13

เขตลึกและหลายเขตและทิศทางที่แตกต่างกันสั่ง Lodash> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);

จริงๆแล้วนี่จะเป็นคำตอบตอนนี้ sortBy ไม่ได้บอกทิศทางของคุณ แต่ orderBy ทำเช่นนั้น
Pablo Palacios

กรุณาแนะนำคำตอบ? stackoverflow.com/questions/62611489/…
reacg garav

5

มีวิธีที่สะดวกในการกำหนดทิศทางต่อคอลัมน์หรือไม่?

ไม่คุณไม่สามารถระบุลำดับการจัดเรียงอื่นที่ไม่ใช่ฟังก์ชันการเรียกกลับที่ส่งค่า ไม่แม้แต่จะเป็นไปได้สำหรับการเรียงลำดับหลายคอลัมน์

คุณอาจจะทำ

 _.each(array_of_objects, function(o) {
     o.typeDesc = -o.type; // assuming a number
 });
 _.sortBy(array_of_objects, ['typeDesc', 'name'])

สำหรับทุกอย่างอื่นคุณจะต้องหันไปหาคนพื้นเมือง.sort()ด้วยฟังก์ชั่นการเปรียบเทียบแบบกำหนดเอง:

 array_of_objects.sort(function(a, b) {
     return a.type - b.type // asc
         || +(b.name>a.name)||-(a.name>b.name) // desc
         || …;
 });

3

ในเอกสารประกอบของเวอร์ชัน 4.11.x กล่าวว่า: `" วิธีนี้เปรียบเสมือน _.sortBy ยกเว้นว่าอนุญาตให้ระบุลำดับการเรียงของ iterate เพื่อเรียงลำดับหากไม่มีการระบุคำสั่งค่าทั้งหมดจะเรียงลำดับจากน้อยไปหามาก ระบุลำดับของ "desc" สำหรับการเรียงจากมากไปน้อยหรือ "asc" สำหรับเรียงลำดับจากน้อยไปหามากของค่าที่สอดคล้องกัน " (แหล่งที่มาhttps://lodash.com/docs/4.17.10#orderBy )

let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])


ฉันคิดว่าคุณตั้งใจจะใช้_.sortByOrder?
AJ Richardson AJ

ไม่สามารถหาตัวแปร _
Vishal Vaghasiya

กรุณาแนะนำคำตอบ? stackoverflow.com/questions/62611489/…
reacg garav

0

คุณสามารถลองสิ่งนี้:

var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));

สิ่งนี้จะช้าลงกว่าการใช้ _.orderBy
reggaeguitar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.