[Quest] มาเขียนฟังก์ชันเรียงข้อมูลกันเถอะ

Earthchie Thanarat
Earthchie
Published in
1 min readSep 22, 2017

เมื่อวานผมโพสต์เปิดประเด็นเรื่องนี้ไว้บนเฟซบุค

ปรากฎว่า อ.วี และ อ.วี (ใช่ ชื่อเดียวกัน และผมนับถือเป็นอาจารย์ทั้งคู่ 555) มาให้ทัศนะเอาไว้ ดูเหมือนว่าเรื่องนี้จะไม่ได้ซับซ้อนอย่างที่ผมคิด เลยตัดสินใจ เขียนเป็นบล็อกเลยดีกว่า จะได้แลกเปลี่ยนกันสะดวกหน่อย เผื่อมีประโยชน์กับคนอื่นด้วย

เข้าประเด็นกันดีกว่า

เรื่องของเรื่องก็คือ ผมมีโจทย์เรื่องการจัดเรียงข้อมูลกลุ่มหนึ่ง ซึ่งจะมี sample ให้ด้านล่างๆ โดยก่อนจะจัดเรียงได้นั้น ต้องจัดกลุ่มข้อมูลก่อน แล้วเรียงจากหน่วยใหญ่ไปหาหน่วยเล็ก

เพื่อให้เข้าใจง่าย ผมจะยกตัวอย่าง สมมุติว่าผมไปทำแบบสอบถามที่พารากอน ได้ภูมิลำเนาของคนมาเยอะแยะ จากนั้นผมต้องการนำข้อมูลมาจัดเรียง โดยคนที่อยู่จังหวัดเดียวกัน ต้องกระจุกอยู่ด้วยกัน ถ้าอยู่อำเภอเดียวกัน ต้องกระจุกอยู่ด้วยกัน เช่นเดียวกับ ตำบล และหมู่ และสุดท้าย ให้เรียงตามลำดับตัวอักษร

ในเบื้องต้นผมเขียนโค้ดภาษา JavaScript มาจัดกลุ่มข้อมูลนี้ได้แล้ว แต่ว่าโค้ดรกและซับซ้อนมากเกินไป โดยผมทำการสร้าง object ขึ้นมาก่อน ให้ key เป็นจังหวัด.อำเภอ.ตำบล.หมู่.ชื่อ เช่น

{
"เชียงใหม่.หางดง.หนองควาย.1.สมชาย":[{...}, {...}],
"ฉะเชิงเทรา.บางปะกง.บางวัว.2.สมหญิง":[{...}, {...}]
}

จากนั้นนำ key มา sort แล้วค่อยนำข้อมูลแต่ละ object มา concat กัน ให้ออกมาเป็น Array ก้อนเดียวกัน

โค้ดของผม สามารถดูได้ที่ jsfiddle ด้านล่างนี้

โค้ดยาว รก และเข้าใจยากมาก

โค้ดนี้ยังไม่ผ่านการ refactor ใดๆ ผมทำมั่วๆ ไปก่อน รู้ตัวอีกทีหลับตื่นมาก็ไม่รู้แล้วว่าตัวเองทำอะไรลงไป มันเข้าใจยากมากจนไม่กล้า refactor เลยทีเดียว

มันจึงนำมาสู่ประเด็นในวันนี้นั่นก็คือ

มีวิธีไหนที่ง่ายกว่านี้ไหม?

ลองทำมาประลองฝีมือกันดูนะครับ

โจทย์คือ: จงเขียนฟังก์ชันทั่วไป ที่รับ Array of Object ไป Sort ให้ได้ตามรายละเอียดที่อธิบายไป โดยมีข้อแม้ว่า ต้องรองรับ Dynamic fields ด้วย กล่าวคือ ฟังก์ชันดังกล่าว ต้องทำงานกับชุดข้อมูลที่มีโครงสร้างแตกต่างออกไปจากนี้ได้ด้วย

ตัวอย่าง เช่น

แบบนี้จะเป็นการจัดเรียงตาม จังหวัด อำเภอ ตำบล หมู่ และชื่อ

sortData(data, ['province','amphoe','district','group','firstname'])

แบบนี้จะเป็นการจัดเรียงตามจังหวัด และชื่อ

sortData(data, ['province','firstname'])

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

จะเขียนใน JavaScript เหมือนผม เพื่อข่มว่าเขียนได้สั้นกว่า หรือจะเขียนในภาษาอื่นๆ ก็ไม่เกี่ยงครับ เอาที่ถนัดได้เลย มาแชร์ๆ กันนะครับ

อันนี้ข้อมูลให้ลองเล่นครับ

ต้นฉบับ: https://project.in.th/quest/data_sorting/original.json
เรียงแล้วต้องได้แบบนี้: https://project.in.th/quest/data_sorting/sorted.json

ผมทำเป็น spreadsheet ไว้ให้ด้วย เผื่อจะสะดวกมากกว่า

ข้อมูลต้นฉบับ

ข้อมูลที่เรียงแล้ว

ขอบคุณที่ร่วมสนุกครับ :3

ป.ล. ไม่เอา Libary สำเร็จรูปนะ แบบนั้นมันก็ไม่สนุกสิ

--

--