Три начина да намерите най-голямото число в масив с помощта на 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: Върнете най-големите числа в масив с линия

Ето моето решение, с вградени коментари, които да ви помогнат да го разберете:

 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: Върнете най-големите числа в масив с вградени функции - с map () и намаляване ()

За това решение ще използвате два метода: метода Array.prototype.map () и метода Array.prototype.reduce ().

  • Методът map () създава нов масив с резултатите от извикването на предоставена функция за всеки елемент в този масив. Използването на map ще извика предоставената функция за обратно извикване веднъж за всеки елемент в масив, по ред, и конструира нов масив от резултатите.
  • Методът намаление () прилага функция спрямо акумулатор и всяка стойност на масива, за да го намали до една стойност.

В тройния оператор е единственият JavaScript оператора, че отнема три операнди. Този оператор се използва като пряк път за оператора 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 ().

  • Методът apply () извиква функция с дадена тази стойност и аргументи, предоставени като масив (или подобен на масив обект).

Можете да предадете масив от аргументи на функция, като използвате метода apply () и функцията ще изпълни елементите в масива.

Такива функции са известни като вариадични функции и те могат да приемат произволен брой аргументи вместо фиксиран.

Функцията 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

Имайте предвид, че първият аргумент, който се прилага () задава стойността на ' this ', която не се използва в този метод, така че предавате null .

Сега, когато имате метод за връщане на най-голямото число в масив, можете да обикаляте всеки под-масив с метода 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

Тази статия се основава на скриптове „Обратен низ“ на алгоритъма „Основен алгоритъм“.

Три начина за факторизиране на число в JavaScript

Тази статия се основава на скриптове за базисен алгоритъм на Free Code Camp „Факторизиране на число“

Два начина за проверка за палиндроми в JavaScript

Тази статия се основава на скриптове за базисен алгоритъм на Free Code Camp „Проверка за палиндроми“.

Три начина за намиране на най-дългата дума в низ в JavaScript

Тази статия се основава на скриптове за основен алгоритъм на Free Code Camp „Намерете най-дългата дума в низ“.

Три начина за озаглавяване на изречение в JavaScript

Тази статия се основава на скриптове за основен алгоритъм на Free Code Camp „Case Case a Sentence“.

Ако имате собствено решение или някакви предложения, споделете ги по-долу в коментарите.

Или можете да ме следвате в Medium , Twitter, Github и LinkedIn , веднага след като щракнете върху зеленото сърце отдолу ;-)

# Останете любопитни, # KeepOnHacking & # MakeItHappen!

Допълнителни ресурси

  • за - MDN
  • array.length - MDN
  • map () метод - MDN
  • метод за намаляване () - MDN
  • Третичен оператор - MDN
  • метод apply () - MDN
  • Math.max () - MDN
  • това - MDN