ใน JavaScript คุณสามารถใช้ค่าสูงสุดในตัวของ Math.max () แต่ก็ยังยากที่จะแยกค่าสูงสุดจากหลายอาร์เรย์
คำอธิบายปัญหา
สมมติว่าคุณมีอาร์เรย์และอาร์เรย์นี้มีจำนวน subarray ของตัวเลขและสิ่งที่เราต้องการทำคือส่งคืนหมายเลขสูงสุดที่ใหญ่ที่สุดจากแต่ละ subarray ในอาร์เรย์
โซลูชันพื้นฐาน
ฟังก์ชั่น largeOffour (arr) {var results = []; // สร้างตัวแปรผลลัพธ์เพื่อจัดเก็บ // สร้างลูปด้านนอกเพื่อสำรวจอาร์เรย์ด้านนอกสำหรับ (var n = 0; n <arr.length; n ++) {var largenumber = 0; // สร้างตัวแปรที่สองเพื่อเก็บหมายเลขที่ใหญ่ที่สุด // สร้างลูปอื่นเพื่อสำรวจ subArray สำหรับ (var sb = 0; sb <arr [n] .length; sb ++) {// ตรวจสอบว่าองค์ประกอบของ subarray มากกว่าค่าสูงสุดที่เก็บไว้หรือไม่ถ้า arr [n] [sb];}} // หลังจากลูปภายในให้บันทึกค่าในแต่ละ subarray ไปยังผลลัพธ์ของผลอาร์เรย์ [n] = largenumber;} // ส่งคืนผลตอบแทนอาร์เรย์; // [34, 456, 4567, 78]วิธีการข้างต้นเป็นวิธีแก้ปัญหาปกติสำรวจอาร์เรย์และ subarrays ผ่านสองสำหรับลูป:
สร้างตัวแปรผลลัพธ์เพื่อจัดเก็บค่าสูงสุดผ่านในแต่ละ subarray
สร้างวงรอบนอกสำหรับการสำรวจอาร์เรย์ด้านนอก
สร้างตัวแปรที่สองที่มีจำนวนมากเพื่อเก็บค่าสูงสุด ค่าตัวแปรนี้จะต้องอยู่ด้านนอกภายในสำหรับลูปเพราะจะไม่ได้รับการกำหนดใหม่
สร้างวินาทีสำหรับการวนซ้ำเพื่อวนซ้ำแต่ละองค์ประกอบใน subarray
A ถ้าใช้คำสั่งเพื่อตรวจสอบว่าองค์ประกอบของ subarray ปัจจุบันมากกว่าค่าสูงสุดที่เก็บไว้ใน subarray ปัจจุบันหรือไม่ หากเป็นจริงให้เก็บค่าสูงสุดนี้ให้เป็นจำนวนมาก
หลังจากลูปภายในเสร็จสิ้นค่าสูงสุดในแต่ละ subarray จะถูกเก็บไว้ในผลลัพธ์ตัวแปรที่ประกาศเริ่มต้น
ในที่สุดก็ส่งคืนอาเรย์ผลลัพธ์
หลังจากใช้ค่าสูงสุดแต่ละค่าใน subarrays ทั้งหมดคุณจะได้รับผลลัพธ์อาร์เรย์ใหม่ ในเวลานี้คุณต้องผ่าน:
array.prototype.max = function () {return math.max.apply ({}, สิ่งนี้);} ที่ใหญ่ที่สุด (arr) .max ();คุณสามารถรับค่าสูงสุด
LargeOffour ([[1,34], [456,2,3,44,234], [4567,1,4,5,6], [34,78,23,1]]). max (); // 4567
สารละลายกลาง
ฟังก์ชั่น largeOffour (arr) {// ใช้ MAP () วิธีการและฟังก์ชันการเรียกกลับเพื่อรวมค่าสูงสุดใน subArray เข้าด้วยกันเพื่อรับ arrray return arr.map ใหม่ (ฟังก์ชั่น (กลุ่ม) {// ใช้วิธีการลดลงเพื่อส่งคืนค่าสูงสุดในแต่ละ subarray ไปยังกลุ่มกลับมา ก่อนหน้า;});});});} ใหญ่โต ([[1,34], [456,2,3,44,234], [4567,1,4,5,6], [34,78,23,1]]); // [34, 456, 4567, 78]ใช้เมธอด array.prototype.map () เพื่อวนซ้ำผ่านอาร์เรย์ในอาร์เรย์ด้านนอก ใช้เมธอดแผนที่ () เพื่อสำรวจอาร์เรย์และฟังก์ชั่นการโทรกลับจะถูกเรียก ในฟังก์ชั่นการโทรกลับแต่ละกลุ่ม subarray จะถูกรวมเข้าด้วยกันโดยใช้วิธีการลด () เพื่อส่งคืนค่าไปยังอาร์เรย์ใหม่ เมื่อใช้วิธีการลด () ฟังก์ชันการโทรกลับจะถูกเรียกด้วย ฟังก์ชั่นการโทรกลับนี้ทำเพียงสิ่งเดียวเท่านั้นซึ่งคือการเปรียบเทียบองค์ประกอบใน subarray หากกระแสสูงกว่าก่อนหน้าจะส่งคืนกระแสไฟฟ้ามิฉะนั้นจะส่งคืนก่อนหน้านี้และค่าสูงสุดในแต่ละ subarray จะได้รับ
ก่อนหน้านี้ค่าสูงสุดจะได้รับในที่สุดผ่าน math.max.apply ()
ทางออกที่ดีที่สุด
ฟังก์ชั่น largeOffour (arr) {return arr.map (function.apply.bind (math.max, null));} ที่ใหญ่ที่สุด ([[1,34], [456,2,3,44,234], [4567,1,1,4,5,6], [34,78,23,1]); // [34, 456, 4567, 78]ในรูปแบบนี้ใช้วิธีการฟังก์ชัน Bind เพื่อสร้างฟังก์ชันการโทรกลับพิเศษซึ่งคล้ายกับวิธี Math.max แต่มีฟังก์ชัน prototype.apply ที่ใช้อาร์เรย์เป็นพารามิเตอร์
ก่อนซ้ำแต่ละองค์ประกอบในอาร์เรย์หลักนั่นคือแต่ละ subarray ภายในอาร์เรย์
การใช้เมธอดแผนที่ () ต้องใช้ฟังก์ชันการเรียกกลับเพื่อค้นหาค่าสูงสุดในแต่ละอาร์เรย์ภายใน คุณต้องสร้างฟังก์ชั่นที่อนุญาตให้ Math.max ยอมรับงานอาร์เรย์อินพุต กล่าวอีกนัยหนึ่งมันง่ายมากและทำงานได้ดีมากเช่น Math.max ([9,43,20,6]); จะส่งคืนค่าสูงสุด 43
วิธีการ prototype.apply สามารถยอมรับอาร์เรย์เป็นพารามิเตอร์ แต่ฟังก์ชั่นใช้บริบทการโทรซึ่งค่อนข้างซับซ้อน ตัวอย่างเช่น math.max.apply (null, [9,43,20,6]) จะเรียกวิธี max.max แต่วิธีการดังกล่าวไม่ง่ายที่จะหา
ที่นี่พารามิเตอร์ NULL จะถูกส่งผ่านไปยังฟังก์ชันวิธีการ Apply วิธีการบอก Math.max ว่าไม่มีบริบทที่จำเป็น
เนื่องจาก arr.map () ต้องใช้ฟังก์ชันการโทรกลับไม่ใช่แค่นิพจน์เราจึงมีฟังก์ชั่นในวิธีการฟังก์ชัน
เนื่องจาก function.prototype.apply เป็นวิธีการคงที่คล้ายกับวัตถุฟังก์ชันเราจึงสามารถเรียกมันว่า function.prototype.bind ที่ถูกผูกไว้กับ function.prototype.apply ตัวอย่างเช่น: function.apply.bind
บริบทของมันสามารถระบุได้ผ่านฟังก์ชั่นฟังก์ชันการเรียกกลับ bind. -bind ฟังก์ชั่นการโทรกลับเช่นเมธอด math.max ในตัวอย่างนี้
เนื่องจากมันถูกฝังอยู่ในฟังก์ชั่นเมธอด prototype.apply จึงจำเป็นต้องมีบริบทเป็นพารามิเตอร์แรกและบริบทนี้ยังคงเป็นเท็จ
ดังนั้นเราจึงส่ง Null เป็นพารามิเตอร์ที่สองไปยัง function.prototype.apply.bind และผูกบริบทซึ่งเป็นวิธี Math.max
เนื่องจาก math.max เป็นอิสระจากบริบทใด ๆ จึงไม่สนใจบริบทปลอมของ function.prototype.apply วิธีการโทร
เราใช้ function.prototype.apply.bind (math.max, null) เพื่อให้ฟังก์ชั่นใหม่ยอมรับค่า arr.map เช่น subarray ในอาร์เรย์
ใช้ค่าสูงสุดในอาร์เรย์หลายมิติ
ข้างต้นใช้วิธีการที่แตกต่างกันเพื่อแยกค่าสูงสุดจาก subarray จากอาร์เรย์สองมิติและฟอร์มค่าสูงสุดเหล่านี้ใหม่ลงในอาร์เรย์ใหม่ หากคุณขยายมันคุณจะต้องใช้ฟังก์ชั่น array.prototype.max เพื่อรับค่าสูงสุดผ่าน math.max.apply ({}, สิ่งนี้) ในฟังก์ชั่น อย่างไรก็ตามหากไม่ใช่อาร์เรย์สองมิติวิธีการข้างต้นจะไม่สามารถดึงค่าที่ใหญ่ที่สุดในอาร์เรย์ได้
เพื่อให้ได้ค่าสูงสุดในอาร์เรย์หลายมิติคุณสามารถรวมเข้ากับวิธีการเข้าร่วม () และแยก ():
ฟังก์ชั่น largeOffour (arr) {var newarray = arr.join (","). แยก (","); return math.max.apply ({}, newarray);} ที่ใหญ่ที่สุด ([12,23]); // => 23largestoffour ([12,23, [1234,324], [345,566]]); // => 1234largestoffour ([12,23, [1234,324, [23121,90890]], [345,566, [345,78,90]]]); // => 1234largestoffour ([12,23, [1234,324, [23121,90890]], [345,566, [345,78,90]]]); // => 90890largestoffour ([12,23, [1234,324, [23121,90890]], [345,566, [345,78,90, [90909090,988]]]; // => 9090909090คุณยังสามารถใช้วิธีการที่คล้ายกันเพื่อลบค่าต่ำสุดในอาร์เรย์หลายมิติ:
ฟังก์ชั่นเล็ก ๆ น้อย ๆ (arr) {var newarray = arr.join (","). แยก (","); return math.min.apply ({}, newarray);} smalleroffour ([12,23]); // => 12SmallerOffour ([112,23, [1234,324], [345,566]]); // => 23SmallerOffour ([212,123, [1234,324, [23121,90890]], [345,566, [345,78,90]]]); // => 23SmallerOffour ([212,123, [1234,324, [23121,90890]], [345,566, [345,78,90]]]); // => 78SmallerOffour ([102,230, [1234,324, [23121,90890]], [345,566, [345,78,90, [90909090,988]]]]; // => 78สรุป
ในบทความ "หมายเหตุการเรียนรู้ JavaScript: การใช้ค่าสูงสุดและค่าต่ำสุดในอาร์เรย์", math.max.apply ({}, arr) ได้รับการแนะนำเพื่อให้ได้จำนวนมากที่สุดในอาร์เรย์ บทความนี้แนะนำวิธีการแยกจำนวนมากที่สุดจากอาร์เรย์สองมิติจากมุมที่แตกต่างกัน แต่ในหลายกรณีอาร์เรย์ยังมีอาร์เรย์หลายมิติ บทความจบลงด้วยการแนะนำวิธีการแยกค่าที่ใหญ่ที่สุดจากอาร์เรย์หลายมิติ หากคุณมีวิธีแก้ปัญหาเพิ่มเติมโปรดแบ่งปันกับเราในความคิดเห็น