Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialshu Chan
2,951 Points(JavaScript) I am trying to do an exercise by referencing the last indexed character in an array but...
Hello I'm doing an exercise where I must build a function which returns the last position that a number appears in an array, for example:
lastIndexOf([ 0, 1, 4, 1, 2 ], 1); should return 3
If the value never occurs, the function should return -1
but I can't seem to find the problem with the code, here it is:
function lastIndexOf(numbers,value){ var foundMatch = false; var result = 0; for(var i = (numbers.length - 1); i >= -1; i--){ if(numbers[i] === value){ foundMatch = true; result = i; } } if(foundMatch){ return result; } else { return -1; } }
console.log(lastIndexOf([ 0, 1, 4, 1, 2 ], 1), "=?", 3); console.log(lastIndexOf([ 0, 1, 4, 1, 2 ], 2), "=?", 4); console.log(lastIndexOf([ 0, 1, 4, 1, 2 ], 3), "=?", -1); console.log(lastIndexOf([ 5, 5, 5 ], 5), "=?", 2); console.log(lastIndexOf([], 3), "=?", -1);
when I run
console.log(lastIndexOf([ 0, 1, 4, 1, 2 ], 1), "=?", 3);
it returns as 1
when i run
console.log(lastIndexOf([ 5, 5, 5 ], 5), "=?", 2);
it returns as 0
I am at a lost as to why my logic would do this. Can someone help me?
4 Answers
andren
28,558 PointsTo illustrate the issue with your logic I'll go though what happens when [5,5,5] gets passed in to the function.
First the if
statement will check if the last number equals value
, since that is the case it sets result
to 2. Then it continues and checks if the second to last number equals value
, which it also does so it sets result
equal to 1. Then it tests if the first number equals value
, which it also does so it sets result
equal to 0.
Based on how your code is written I assume you mean for the checking to stop once a match is found, but nothing in your code actually stops the loop when a match is found. If you added a break
statement to the if
statement like this:
function lastIndexOf(numbers, value) {
var foundMatch = false;
var result = 0;
for (var i = (numbers.length - 1); i >= -1; i--) {
if (numbers[i] === value) {
foundMatch = true;
result = i;
break;
}
}
if (foundMatch) {
return result;
} else {
return -1;
}
}
Then your code would work, as it now ends the loop once a match is found.
However your code is somewhat redundant in how it is written, if you simply place the code to return the number within the if
statement and place the return -1
outside the loop then your code will work without needing the foundMatch
and result
variable.
Like this:
function lastIndexOf(numbers, value) {
for (var i = (numbers.length - 1); i >= -1; i--) {
if (numbers[i] === value) {
return i;
}
}
return -1;
}
shu Chan
2,951 PointsWow what an elegant solution! Thank you! How can I show the code like you do? (in what seems to be sublime)
andren
28,558 PointsTreehouse has a code box that you can use to display code in your post. If you click on the "Markdown Cheatsheet" link below the text input box you will find instructions on how to have it format the code.
But basically you just need to place three backticks and the name of the language on one line line to indicate the start of the code block like this:
```JavaScript
Then the code below that line, then you need three more backticks on a separate line. Like this:
```
To mark the end of the code block.
shu Chan
2,951 Points// Like this?
Awesome thank you andren. One more question, why is it that in your less redundant answer, breaks are not required? wouldn't the logic still loop through the whole array?
andren
28,558 PointsA function can only return once, meaning that a return
statement essentially marks the end of the function.
So not only does the loop not continue after the return
statement, nothing in the function continues after it. The function is done running once JavaScript encounters a return
. This is also true in most other modern programming languages.
For example if you have a function that looks like this:
function example() {
return 0;
console.log("This will never be printed");
return 1;
}
Then it would return 0, and not print out anything. Since the moment the first return
is hit it would stop the function, meaning that the second and third line would never be reached.
shu Chan
2,951 PointsAh thank you! That is ver helpful!