-
Notifications
You must be signed in to change notification settings - Fork 0
Method .sort #15
Description
ข้อควรรู้ของ method .sort
- เป็น method แบบ in place แปลว่ามันจะ sort ตัวแปร/ref เดิมที่เก็บ (มี side effect)
- เมื่อก่อนมันจะ sort แบบไม่ stable แต่ในปัจจุบัน stable แล้ว
Stable Sort คืออะไร? เวลาเราต้องเรียงข้อมูลหลายอย่าง เช่น ตามชื่อ -> ตามอายุ เรามักจะชินกับการ .sort() หลายๆ รอบ ซึ่งเมื่อก่อน JS sort แบบไม่ Stable แปลว่าชื่อที่เรียงไว้ก่อนอายุมีโอกาสไม่เรียงตามเดิม ทำให้เราต้องเขียน condition ใน sort เยอะๆ
data.sort((a, z) => {
if (a.age === z.age) return a.name.localeCompare(z.name);
return a.age - z.age;
});แต่ในปัจจุบันการ sort ใน JS มัน Stable แล้ว แปลว่าตอนนี้เราทำตามข้างล่างได้แล้ว
data
.sort((a, z) => a.name.localeCompare(z.name))
.sort((a, z) => a.age - z.age);ทำยังไงให้รู้ว่า sort จากน้อยไปมากหรือมากไปน้อย
วิธีง่ายๆ ที่จะทำให้รู้ว่ามันเรียงจากมากไปน้อยหรือน้อยไปมาก คือให้ใช้ params ของ lambda เป็น (a, z)
- เรียงจากน้อยไปมาก ให้ return เป็น
a - z(.sort((a, z) => a - z)) ก็คือเรียงจาก A ไป Z - กลับกันถ้าเรียงจากมากไปน้อย ให้ return เป็น
z - a(.sort((a, z) => z - a)) ก็คือเรียงจาก Z ไป A
เรียงภาษาไทยให้ถูก
อย่างที่เรารู้ๆ กันว่า ถ้าจะ sort string จากน้อยไปมาก ใช้ .sort() เฉยๆ ก็ได้ หรือใช้ <, > ก็ได้
const data = ['Alex', 'Steve', 'Conner', 'xQc', 'Benjamin'];
// data.sort(); ใช้ได้เหมือนกัน 👍
data.sort((a, z) => {
if (a < z) return -1; // -1 คือ เอา a ไปวางก่อนหน้า z
if (a > z) return 1; // 1 คือ เอา a ไปวางหลัง z
return 0; // 0 คือมันเท่ากัน
});
// -> ['Alex', 'Benjamin', 'Conner', 'Steve', 'xQc']ดู algorithm ของ
SortCompare(x, y)(default) ได้ที่ https://262.ecma-international.org/6.0/#sec-sortcompare
แต่ถ้าเป็นข้อมูลภาษาไทยจะมีโอกาสเรียงผิด เช่น
const data = ['เชษฐา', 'ชัชชาติ', 'สมเกียรติ', 'ไชยวัฒน์', 'เยาว์ลักษณ์'];
data.sort();
// -> ['ชัชชาติ', 'สมเกียรติ', 'เชษฐา', 'เยาว์ลักษณ์', 'ไชยวัฒน์'] ❌
// ต้องเอา `ช` ขึ้นก่อน `ย` และ `ย` ต้องอยู่ก่อน `ส` ด้วยวิธีแก้คือ ให้ใช้ <string>.localeCompare(<string>)
const data = ['เชษฐา', 'ชัชชาติ', 'สมเกียรติ', 'ไชยวัฒน์', 'เยาว์ลักษณ์'];
data.sort((a,z) => a.localeCompare(z));
// -> ['ชัชชาติ', 'เชษฐา', 'ไชยวัฒน์', 'เยาว์ลักษณ์', 'สมเกียรติ'] ✅