อาร์เรย์สับเปลี่ยนผีเสื้อใน JavaScript คืออาร์เรย์ของ Numbers ที่จัดเรียงเพื่อให้ตัวเลขลดลงเมื่อเราเข้าใกล้ศูนย์กลางของอาร์เรย์และเพิ่มขึ้นเมื่อเราเข้าใกล้จุดสิ้นสุดของอาร์เรย์ ตัวเลขที่ใหญ่ที่สุดอยู่ที่ดัชนีแรกสุด
อีกรูปแบบหนึ่งของอาร์เรย์สับเปลี่ยนผีเสื้อคือการที่ตัวเลขเพิ่มขึ้นไปทางกึ่งกลางและลดลงในตอนท้าย ในกรณีนี้ ตัวเลขที่น้อยที่สุดจะอยู่ที่ดัชนีแรกสุด
สำหรับผู้ที่มาจากพื้นฐานคณิตศาสตร์ อาจมีความเกี่ยวข้องกับ Guassiandistribution
ตัวอย่าง
สมมติว่าเรามีอาร์เรย์นี้ -
const arr = [8,2,6,3,9,1,4,5,0,7];
หากเราใช้บัตเตอร์ฟลายสับเปลี่ยน ผลลัพธ์จะเป็น −
[9, 7, 5, 3, 1,0, 2, 4, 6, 8]
ดูว่าตัวเลขที่ใหญ่ที่สุดและอันดับสองอยู่ที่ปลายสุดและตัวเลขที่เล็กที่สุดอยู่ตรงกลางอย่างไร
ความเป็นไปได้อีกอย่างหนึ่งก็คือ −
[0, 2, 4, 6, 8, 9, 7, 5, 3, 1]
งานของเราคือการเขียนฟังก์ชันที่ใช้อาร์เรย์ของ Numbers และสตริงเป็นอาร์กิวเมนต์ที่สอง สตริงสามารถรับค่าใดค่าหนึ่งจากสองค่า 'asc' หรือ 'des' −
-
หากสตริงเป็น 'des' เราต้องสับเปลี่ยนอาร์เรย์โดยเพิ่มเป็นลำดับที่ลดลง
-
หากเป็น 'asc' เราต้องสับเปลี่ยนอาร์เรย์เพื่อลดลำดับที่เพิ่มขึ้น
แนวทาง
-
หากสตริงเป็น 'asc' เราจะจัดเรียงอาร์เรย์ในลำดับจากน้อยไปมาก มิฉะนั้นจะเรียงลำดับจากมากไปน้อย ดังนั้น ให้พิจารณาว่าฟังก์ชันถูกเรียกด้วย 'asc' จากนั้นอาร์เรย์จะมีลักษณะดังนี้ -
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-
จากนั้นเราแบ่งอาร์เรย์ออกเป็นสองอาร์เรย์เพื่อให้องค์ประกอบที่อยู่ติดกันกระจายเป็นอาร์เรย์ตรงข้าม เราผลักองค์ประกอบในอาร์เรย์หนึ่งในขณะที่เรายกเลิกการเปลี่ยนองค์ประกอบในอีกอาร์เรย์หนึ่ง เพื่อให้อาร์เรย์หนึ่งถูกเปลี่ยนกลับโดยที่เราไม่ต้องดำเนินการด้วยตนเอง
อาร์เรย์ทั้งสองรูปแบบจะมีลักษณะดังนี้ -
[ 0, 2, 4, 6, 8 ] [ 9, 7, 5, 3, 1 ]
-
ขั้นตอนสุดท้ายคือการต่ออาร์เรย์เหล่านี้เข้าด้วยกันและหลังจากนั้นเราจะได้อาร์เรย์ที่ต้องการ ทั้งหมดนี้เมื่อใส่รหัสจะมีลักษณะดังนี้ -
ตัวอย่าง
const array = [8,2,6,3,9,1,4,5,0,7]; const butterflyShuffle = (array, order = 'asc') => { //creating a new copy of array so that we dont mutate the original array const arr = array.slice(); //sorting ascending or descending based on the argument arr.sort((a, b) => order === 'asc' ? a-b : b-a); const first = [], second = []; //this variable will later help in determining which array is to be reversed //and which one is to be concatenated to which //if length is even, it means that last element will go in second array //otherwise it will go in first array const isEven = arr.length % 2 === 0; for (let i = 0; i < arr.length; i++){ if(i % 2 === 0){ isEven ? first.push(arr[i]) : first.unshift(arr[i]); continue; }; isEven ? second.unshift(arr[i]) : second.push(arr[i]); }; return isEven ? second.concat(first) : first.concat(second); }; console.log(butterflyShuffle(array)); console.log(butterflyShuffle(array, 'des'));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น -
[ 9, 7, 5, 3, 1, 0, 2, 4, 6, 8 ] [ 0, 2, 4, 6, 8, 9, 7, 5, 3, 1 ]