ثلاث طرق يمكنك من خلالها إيجاد أكبر رقم في مصفوفة باستخدام JavaScript

في هذه المقالة ، سأشرح كيفية حل تحدي "إرجاع أكبر الأرقام في المصفوفات " في Free Code Camp . يتضمن ذلك إرجاع مصفوفة تحتوي على أكبر عدد من كل من المصفوفات الفرعية.

هناك ثلاث طرق سأغطيها:

  1. مع حلقة FOR
  2. باستخدام طريقة الاختزال ()
  3. باستخدام Math.max ()

وصف تحدي الخوارزمية

قم بإرجاع مصفوفة تتكون من أكبر رقم من كل مصفوفة فرعية متوفرة. للتبسيط ، ستحتوي المصفوفة المتوفرة بالضبط على 4 مصفوفات فرعية.

تذكر ، يمكنك التكرار من خلال مصفوفة باستخدام حلقة for بسيطة ، والوصول إلى كل عضو باستخدام بنية المصفوفة arr [i].

function largestOfFour(arr) { return arr; } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 

حالات الاختبار المقدمة

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]) should return an array. largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) should return [27,5,39,1001]. largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]) should return [9, 35, 97, 1000000].

الأسلوب رقم 1: إرجاع أكبر الأرقام في مصفوفة باستخدام For Loop

هذا هو الحل الذي أقدمه مع التعليقات المضمنة لمساعدتك على فهمه:

 function largestOfFour(arr) { // Step 1. Create an array that will host the result of the 4 sub-arrays var largestNumber = [0,0,0,0]; // Step 2. Create the first FOR loop that will iterate through the arrays for(var arrayIndex = 0; arrayIndex < arr.length; arrayIndex++) { /* The starting point, index 0, corresponds to the first array */ // Step 3. Create the second FOR loop that will iterate through the sub-arrays for(var subArrayIndex = 0; subArrayIndex  largestNumber[arrayIndex]) { largestNumber[arrayIndex] = arr[arrayIndex][subArrayIndex]; /* FOR loop cycles arrayIndex => i subArrayIndex => j Iteration in the first array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[0][0] => 4 largestNumber[0] => 0 4 > 0? => TRUE then largestNumber[0] = 4 Second iteration: arr[0][1] => 5 largestNumber[0] => 4 5 > 4? => TRUE then largestNumber[0] = 5 Third iteration: arr[0][2] => 1 largestNumber[0] => 5 1 > 5? => FALSE then largestNumber[0] = 5 Fourth iteration: arr[0][3] => 3 largestNumber[0] => 5 3 > 5? => FALSE then largestNumber[0] = 5 Fifth iteration: arr[0][4] => FALSE largestNumber[0] => 5 largestNumber = [5,0,0,0] Exit the first array and continue on the second one Iteration in the second array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[1][0] => 13 largestNumber[1] => 0 13 > 0? => TRUE then largestNumber[1] = 13 Second iteration: arr[1][1] => 27 largestNumber[1] => 13 27 > 13? => TRUE then largestNumber[1] = 27 Third iteration: arr[1][2] => 18 largestNumber[1] => 27 18 > 27? => FALSE then largestNumber[1] = 27 Fourth iteration: arr[1][3] => 26 largestNumber[1] => 27 26 > 27? => FALSE then largestNumber[1] = 27 Fifth iteration: arr[1][4] => FALSE largestNumber[1] => 27 largestNumber = [5,27,0,0] Exit the first array and continue on the third one Iteration in the third array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[2][0] => 32 largestNumber[2] => 0 32 > 0? => TRUE then largestNumber[2] = 32 Second iteration: arr[2][1] => 35 largestNumber[2] => 32 35 > 32? => TRUE then largestNumber[2] = 35 Third iteration: arr[2][2] => 37 largestNumber[2] => 35 37 > 35? => TRUE then largestNumber[2] = 37 Fourth iteration: arr[2][3] => 39 largestNumber[2] => 37 39 > 37? => TRUE then largestNumber[2] = 39 Fifth iteration: arr[2][4] => FALSE largestNumber[2] => 39 largestNumber = [5,27,39,0] Exit the first array and continue on the fourth one Iteration in the fourth array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[3][0] => 1000 largestNumber[3] => 0 1000 > 0? => TRUE then largestNumber[3] = 1000 Second iteration: arr[3][1] => 1001 largestNumber[3] => 1000 1001 > 1000? => TRUE then largestNumber[3] = 1001 Third iteration: arr[3][2] => 857 largestNumber[3] => 1001 857 > 1001? => FALSE then largestNumber[3] = 1001 Fourth iteration: arr[3][3] => 1 largestNumber[3] => 1001 1 > 1001? => FALSE then largestNumber[3] = 1001 Fifth iteration: arr[3][4] => FALSE largestNumber[3] => 1001 largestNumber = [5,27,39,1001] Exit the FOR loop */ } } } // Step 4. Return the largest numbers of each sub-arrays return largestNumber; // largestNumber = [5,27,39,1001]; } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

وها هي بدون تعليقاتي:

 function largestOfFour(arr) { var largestNumber = [0,0,0,0]; for(var arrayIndex = 0; arrayIndex < arr.length; arrayIndex++) { for(var subArrayIndex = 0; subArrayIndex  largestNumber[arrayIndex]) { largestNumber[arrayIndex] = arr[arrayIndex][subArrayIndex]; } } } return largestNumber; } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

الطريقة رقم 2: إرجاع أكبر الأرقام في مصفوفة باستخدام الدالات المضمنة - باستخدام الخريطة () وتقليل ()

بالنسبة لهذا الحل ، ستستخدم طريقتين: طريقة Array.prototype.map () وطريقة Array.prototype.reduce ().

  • على خريطة () الأسلوب بإنشاء مجموعة جديدة مع نتائج استدعاء دالة المقدمة على كل عنصر في هذه المجموعة. سيؤدي استخدام الخريطة إلى استدعاء دالة رد نداء مقدمة مرة واحدة لكل عنصر في مصفوفة ، بالترتيب ، وبناء مصفوفة جديدة من النتائج.
  • ل لحد من () ينطبق طريقة وظيفة ضد تراكم وكل قيمة من مجموعة للحد من أن قيمة واحدة.

في المشغل الثلاثي هي المشغل جافا سكريبت فقط أن يأخذ ثلاثة المعاملات. يتم استخدام هذا العامل كاختصار لبيان if.

(currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber;

يمكن أيضًا قراءة هذا على النحو التالي:

if (currentLargestNumber > previousLargestNumber == true) { return currentLargestNumber; } else { return previousLargestNumber; }

هذا هو الحل مع التعليقات المضمنة:

 function largestOfFour(mainArray) { // Step 1. Map over the main arrays return mainArray.map(function (subArray){ // Step 3. Return the largest numbers of each sub-arrays => returns [5,27,39,1001] // Step 2. Grab the largest numbers for each sub-arrays with reduce() method return subArray.reduce(function (previousLargestNumber, currentLargestNumber) { return (currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber; /* Map process and Reduce method cycles currentLargestNumber => cLN previousLargestNumber => pLN Iteration in the first array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 4 0 4 > 0? => TRUE 4 / Second iteration: 5 4 5 > 4? => TRUE 5 / Third iteration: 1 5 1 > 5? => FALSE / 5 Fourth iteration: 3 5 3 > 5? => FALSE / 5 Fifth iteration: / 5 returns 5 Exit the first array and continue on the second one Iteration in the second array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 13 0 13 > 0? => TRUE 13 / Second iteration: 27 13 27 > 13? => TRUE 27 / Third iteration: 18 27 18 > 27? => FALSE / 27 Fourth iteration: 26 27 26 > 27? => FALSE / 27 Fifth iteration: / 27 returns 27 Exit the first array and continue on the third one Iteration in the third array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 32 0 32 > 0? => TRUE 32 / Second iteration: 35 32 35 > 32? => TRUE 35 / Third iteration: 37 35 37 > 35? => TRUE 37 / Fourth iteration: 39 37 39 > 37? => TRUE 39 / Fifth iteration: / 39 returns 39 Exit the first array and continue on the fourth one Iteration in the fourth array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 1000 0 1000 > 0? => TRUE 1000 / Second iteration: 1001 1000 1001 > 1000? => TRUE 1001 / Third iteration: 857 1001 857 > 1001 => FALSE / 1001 Fourth iteration: 1 1001 1 > 1001? => FALSE / 1001 Fifth iteration: / 1001 returns 1001 Exit the first array and continue on the fourth one */ }, 0); // 0 serves as the context for the first pLN in each sub array }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

وهنا بدون تعليقات:

 function largestOfFour(mainArray) { return mainArray.map(function (subArray){ return subArray.reduce(function (previousLargestNumber, currentLargestNumber) { return (currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber; }, 0); }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

المقاربة رقم 3: إرجاع أكبر الأرقام في مصفوفة مع الدالات المضمنة - باستخدام الخريطة () وتطبيق ()

بالنسبة لهذا الحل ، ستستخدم طريقتين: طريقة Array.prototype.map () وطريقة Function.prototype.apply ().

  • و تطبيق () استدعاءات الأسلوب وظيفة مع إعطاء هذه القيمة والحجج على النحو المنصوص عليه مجموعة (أو صفيف مثل الكائن).

يمكنك تمرير مصفوفة من المتغيرات إلى دالة باستخدام طريقة application () وستقوم الوظيفة بتنفيذ العناصر الموجودة في المصفوفة.

تُعرف هذه الوظائف باسم الدوال المتغيرة ، ويمكنها قبول أي عدد من الوسائط بدلاً من واحدة ثابتة.

و Math.max () الدالة بإرجاع أكبر من الأرقام صفر أو أكثر، ونحن يمكن أن تمر أي عدد من الحجج.

console.log(Math.max(4,5,1,3)); // logs 5

لكن لا يمكنك تمرير مصفوفة من الأرقام إلى الطريقة كما يلي:

var num = [4,5,1,3]; console.log(Math.max(num)); // logs NaN

هذا هو المكان الذي يتبين فيه أن طريقة apply () مفيدة:

var num = [4,5,1,3]; console.log(Math.max.apply(null, num)); // logs 5

لاحظ أن الوسيطة الأولى التي يجب تطبيق () تحدد قيمة " هذا " ، غير مستخدمة في هذه الطريقة ، لذا فإنك تمرر قيمة خالية .

الآن بعد أن أصبح لديك طريقة لإرجاع أكبر رقم في مصفوفة ، يمكنك إجراء حلقة خلال كل مصفوفة فرعية باستخدام طريقة map () وإرجاع جميع الأرقام الأكبر.

هذا هو الحل مع التعليقات المضمنة:

 function largestOfFour(mainArray) { // Step 1. Map over the main arrays return mainArray.map(function(subArray) { // Step 3. Return the largest numbers of each sub-arrays => returns [5,27,39,1001] // Step 2. Return the largest numbers for each sub-arrays with Math.max() method return Math.max.apply(null, subArray); }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

وبدون تعليقات:

 function largestOfFour(mainArray) { return mainArray.map(function(subArray) { return Math.max.apply(null, subArray); }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

اتمنى ان تكون وجدت ذلك مفيدا. هذا جزء من سلسلة مقالاتي بعنوان "كيفية حل خوارزميات FCC" حول تحديات خوارزمية Free Code Camp ، حيث أقترح العديد من الحلول وأشرح خطوة بخطوة ما يحدث تحت الغطاء.

ثلاث طرق لتكرار سلسلة في JavaScript

في هذه المقالة ، سأشرح كيفية حل تحدي FreeCodeCamp "كرر سلسلة كرر سلسلة". وهذا ينطوي…

طريقتان لتأكيد نهاية سلسلة في JavaScript

في هذه المقالة ، سأشرح كيفية حل تحدي "تأكيد النهاية" الخاص بـ freeCodeCamp.

ثلاث طرق لعكس سلسلة في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "عكس سلسلة"

ثلاث طرق لتحليل رقم في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "تحويل رقم إلى عوامل"

طريقتان للتحقق من وجود Palindromes في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "التحقق من وجود Palindromes".

ثلاث طرق للعثور على أطول كلمة في سلسلة في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "العثور على أطول كلمة في سلسلة".

ثلاث طرق لعنوان الحالة جملة في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "حالة العنوان جملة".

إذا كان لديك الحل الخاص بك أو أي اقتراحات ، فشاركها أدناه في التعليقات.

أو يمكنك متابعتي على Medium و Twitter و Github و LinkedIn ، مباشرة بعد النقر فوق القلب الأخضر أدناه ؛-)

# StayCurious ، # KeepOnHacking و # MakeItHappen!

مصادر إضافية

  • لـ - MDN
  • array.length - MDN
  • طريقة الخريطة () - MDN
  • تقليل () طريقة - MDN
  • مشغل ثلاثي - MDN
  • تطبيق () طريقة - MDN
  • Math.max () - MDN
  • هذا - MDN