På tre måder kan du finde det største tal i en matrix ved hjælp af JavaScript

I denne artikel vil jeg forklare, hvordan man løser Free Code Camps "Returner største numre i arrays " -udfordring. Dette indebærer at returnere en matrix med de største tal fra hver af underarrayerne.

Der er de tre tilgange, jeg vil dække:

  1. med en FOR-loop
  2. ved hjælp af reducere () metoden
  3. ved hjælp af Math.max ()

Algoritmeudfordringsbeskrivelsen

Returner en matrix bestående af det største antal fra hver leverede undergruppe. For at gøre det nemmere vil den leverede matrix indeholde nøjagtigt 4 underarrays.

Husk, du kan gentage gennem en matrix med en enkel for loop og få adgang til hvert medlem med array-syntaks arr [i].

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

Medfølgende testtilfælde

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].

Tilgang nr. 1: Returner de største numre i en matrix med en for løkke

Her er min løsning med indlejrede kommentarer, der hjælper dig med at forstå det:

 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]]);

Og her er det uden mine kommentarer:

 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]]);

Fremgangsmåde nr. 2: Returner de største tal i en matrix med indbyggede funktioner - med kort () og reducer ()

Til denne løsning bruger du to metoder: Metoden Array.prototype.map () og Array.prototype.reduce () -metoden.

  • Den kortet () metode skaber en ny array med resultaterne af at kalde en forudsat funktion på hvert enkelt element i dette array. Brug af kort kalder en leveret tilbagekaldsfunktion én gang for hvert element i en matrix i rækkefølge og konstruerer et nyt array ud fra resultaterne.
  • Metoden reducere () anvender en funktion mod en akkumulator og hver værdi i arrayet for at reducere den til en enkelt værdi.

Den ternære operatør er den eneste JavaScript-operatør, der tager tre operander. Denne operatør bruges som en genvej til if-sætningen.

(currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber;

Dette kan også læses som:

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

Her er min løsning med indlejrede kommentarer:

 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]]);

Og her er det uden kommentarer:

 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]]);

Fremgangsmåde 3: Returner de største numre i en matrix med indbyggede funktioner - med kort () og anvend ()

Til denne løsning bruger du to metoder: Array.prototype.map () -metoden og Function.prototype.apply () -metoden.

  • Metoden Apply () kalder en funktion med en given denne værdi og argumenter leveret som et array (eller et array-lignende objekt).

Du kan videregive en række argumenter til en funktion ved hjælp af metoden Apply () , og funktionen udfører elementerne i arrayet.

Sådanne funktioner kaldes variadiske funktioner , og de kan acceptere et vilkårligt antal argumenter i stedet for en fast.

Den Math.max () -funktionen giver den største af nul eller flere numre, og vi kan passere et vilkårligt antal argumenter.

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

Men du kan ikke videregive en række numre til metoden som denne:

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

Det er her, hvor anvendelse () -metoden viser sig at være nyttig:

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

Bemærk, at det første argument, der skal anvendes (), indstiller værdien af ​​' dette ', ikke brugt i denne metode, så du videregiver null .

Nu hvor du har en metode til at returnere det største tal i en matrix, kan du løbe gennem hver underarray med map () -metoden og returnere alle største tal.

Her er min løsning med indlejrede kommentarer:

 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]]);

Og uden kommentarer:

 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]]);

Jeg håber, du fandt dette nyttigt. Dette er en del af min "How to Solve FCC Algorithms" -serie om artikler om Free Code Camp Algorithm Challenges, hvor jeg foreslår flere løsninger og forklarer trin for trin, hvad der sker under emhætten.

Tre måder at gentage en streng i JavaScript

I denne artikel vil jeg forklare, hvordan man løser freeCodeCamp's "Gentag en streng gentag en streng" -udfordring. Dette involverer ...

To måder at bekræfte afslutningen på en streng i JavaScript

I denne artikel forklarer jeg, hvordan man løser freeCodeCamp's "Confirm the Ending" -udfordring.

Tre måder at vende en streng i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Vend en streng”

Tre måder at faktorisere et nummer i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Faktoriser et tal”

To måder at kontrollere palindromer i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Check for Palindromes”.

Tre måder at finde det længste ord i en streng i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting "Find det længste ord i en streng".

Tre måder at betegne sag på en sætning i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting "Titel sag en sætning".

Hvis du har din egen løsning eller forslag, så del dem nedenfor i kommentarerne.

Eller du kan følge mig på Medium , Twitter, Github og LinkedIn lige efter at du har klikket på det grønne hjerte nedenfor ;-)

# StayCurious, # KeepOnHacking & # MakeItHappen!

Yderligere ressourcer

  • til - MDN
  • array.length - MDN
  • map () metode - MDN
  • reducere () metode - MDN
  • Ternær operatør - MDN
  • anvend () metode - MDN
  • Math.max () - MDN
  • dette - MDN