So, I've been doing freeCodeCamp for a while, and I need an explanation for the following:
function largestOfFour(arr) {
var results = [];
for (var n = 0; n < arr.length; n++) {
var largestNumber = arr[n][0];
for (var sb = 1; sb < arr[n].length; sb++) {
if (arr[n][sb] > largestNumber) {
largestNumber = arr[n][sb];
}
}
results[n] = largestNumber;
}
return results;
}
This is the beginner's solution provided by FCC, and I wrote the correct solution, but my code is wrong and I don't understand why there's a need for var results or for var largestNumber. Why can't I return arr[n][sb] as is?
Top comments (5)
What did you write as your solution?
I think I can guess what the issue is and your confusion. I can't see the prompt, but the way it's written it looks at first like they want you to find a single value--the max out element, the ultimate max of an array of arrays, for example. At first glance that's what I thought until I read it more carefully--it looks like they want you to give an array of the max elements of arrays. So, at first glance:
You can't return
arr[n][sb]
as is for two reasons in the above code:(arr[n][sb] > largestNumber)
being true means that element is currently larger than the largestNumber and all other elements that have preceded it--but NOT the elements after. Imagine you had an array [1,2,3,4] -- 2 is larger than 1, but if you return that then since you've found a larger number, you miss the others. You've proved that it is larger but not THE largest since you have no knowledge at that point of the numbers after it.... I forgot what number two is. :P
FWIW, I found it confusing too; both the first time I did something like that last semester and in reading their code. Also I don't love their naming style....
Anywho:
And for good measure, what I had thought they wanted and how I would've written it:
The problem:
Return an array consisting of the largest number from each provided sub-array. For simplicity, the provided array will contain exactly 4 sub-arrays.
Remember, you can iterate through an array with a simple for loop, and access each member with array syntax arr[i].
My solution:
function largestOfFour(arr) {
for (i = 0; i < arr.length; i++) {
var largest = arr[i][0];
for (j = 0; j < arr[i].length; j++) {
if (arr[i][j] > largest) {
return arr[i][j];
}
}
}
Why do I need to have an empty bracket set for largestNumberArray, per your example? I'm not exactly clear on that part.
Because the function would stop there!
i
never turns2
, the function stops/dies oncereturn
runs. Now here is an array:And this is your solution (you provided in the comments)
Line two loops through the parent array,
largest
becomes1
. Then in line 4 we try to loop through the first child array ([1,12,13,4]
). The if statement, the first time checks if1
(child array, first value) is bigger than1
, it's not. Then it check if12
(child array, second value) is bigger than1
, it is. Then it return12
. END OF CODE.That's why you can't return
arr[i][j]
.Now if we do not return it, but instead replace the large number we have something like this
By the time the loops are done
largest
will end up being16
. So if the task was to find the largest number in all the arrays that would work (scoping problems excluded).What we need though is to return the largest number from each array
results[i] = largest
stores the larges number from the first array, then the largest number from the second array (plain english). Then, knowing that there are no more arrays to check, those two big numbers are return (at the end of all the operations)Thank you! This was so helpful and cleared it up for me!