เรามีอาร์เรย์ที่มีตัวเลขและสตริงผสม ต้องการเรียงให้ตัวเลขเรียงก่อนและวางหน้าสตริงทุกตัว แล้วค่อยสตริงเรียงตามลำดับอักษร
เช่น อาร์เรย์นี้หลังเรียง
const arr = [1, 'fdf', 'afv', 6, 47, 7, 'svd', 'bdf', 9];
ควรเป็น
[1, 6, 7, 9, 47, 'afv', 'bdf', 'fdf', 'svd']
เขียนโค้ด
ตัวอย่าง
const arr = [1, 'fdf', 'afv', 6, 47, 7, 'svd', 'bdf', 9];
const sorter = (a, b) => {
if(typeof a === 'number' && typeof b === 'number'){
return a - b;
}else if(typeof a === 'number' && typeof b !== 'number'){
return -1;
}else if(typeof a !== 'number' && typeof b === 'number'){
return 1;
}else{
return a > b ? 1 : -1;
}
}
arr.sort(sorter);
console.log(arr);
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น
[ 1, 6, 7, 9, 47, 'afv', 'bdf', 'fdf', 'svd' ]
เข้าใจโค้ด
ส่วนสำคัญคือฟังก์ชัน sorter เรารู้ว่า callback รับสองอาร์กิวเมนต์ คือสมาชิกของอาร์เรย์
มี 4 กรณี
- a และ b ทั้งคู่เป็นตัวเลข → วางตัวเลขน้อยกว่าก่อน
- a เป็นตัวเลข b เป็นสตริง → วางตัวเลข (a) ก่อนสตริง (b) ตามโจทย์
- a เป็นสตริง b เป็นตัวเลข → วาง b ก่อน a
- a และ b ทั้งคู่เป็นสตริง → ตรวจสอบว่าสตริงไหนมาก่อนตามลำดับอักษร วางตัวนั้นก่อน