มีคำตอบที่ดีมากมายที่นี่ แต่ฉันอยากจะชี้ให้เห็นว่าพวกเขาสามารถขยายได้ง่าย ๆ เพื่อให้ได้การจัดเรียงที่ซับซ้อนมากขึ้น สิ่งเดียวที่คุณต้องทำคือใช้ตัวดำเนินการ OR เพื่อเปรียบเทียบฟังก์ชันลูกโซ่เช่นนี้:
objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )
ที่ไหนfn1
, fn2
... มีฟังก์ชั่นการจัดเรียงที่ผลตอบแทน [-1,0,1] ผลลัพธ์นี้ใน "sorting by fn1", "sorting by fn2" ซึ่งค่อนข้างจะเท่ากับ ORDER BY ใน SQL
การแก้ปัญหานี้จะขึ้นอยู่กับลักษณะการทำงานของ||
ผู้ประกอบการซึ่งจะประเมินกับการแสดงออกครั้งแรกที่ได้รับการประเมินที่สามารถแปลงเป็นจริง
แบบฟอร์มที่ง่ายที่สุดมีฟังก์ชันอินไลน์เพียงฟังก์ชันเดียวดังนี้:
// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )
มีสองขั้นตอน last_nom
ในการfirst_nom
เรียงลำดับจะเป็นดังนี้:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) ||
a.first_nom.localeCompare(b.first_nom) )
ฟังก์ชันการเปรียบเทียบทั่วไปอาจเป็นดังนี้:
// ORDER BY <n>
let cmp = (a,b,n)=>a[n].localeCompare(b[n])
ฟังก์ชั่นนี้สามารถขยายเพื่อรองรับฟิลด์ตัวเลข, ความไวของเคส, ประเภทข้อมูลทางโบราณคดีเป็นต้น
คุณสามารถใช้มันเพื่อผูกมัดพวกเขาโดยเรียงลำดับความสำคัญ:
// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> cmp(a,b, "last_nom") || cmp(a,b, "first_nom") )
// ORDER_BY last_nom, first_nom DESC
objs.sort((a,b)=> cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
// ORDER_BY last_nom DESC, first_nom DESC
objs.sort((a,b)=> -cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
จุดที่นี่คือ JavaScript ที่บริสุทธิ์ด้วยวิธีการทำงานสามารถนำคุณไปได้ไกลโดยไม่ต้องใช้ไลบรารีภายนอกหรือรหัสที่ซับซ้อน นอกจากนี้ยังมีประสิทธิภาพมากเนื่องจากไม่มีการแยกสตริงที่ต้องทำ