michael-38
michael-38

Reputation: 43

Finding index of the last time a value occur in an array

Without using .indexOf, I'm trying to loop through an array from the end to find the last occurrence of a specific value. This is what I have so far but it keeps returning undefined.

var lastIndexOf = function (array, index) {
  for (i=array.length-1; i < 0; i--) {
    if (array[i] === index) {
    return i;
    }
  }
}


console.log(lastIndexOf([ 0, 1, 4, 1, 2 ], 1); //should return 3
console.log(lastIndexOf([ 0, 1, 4, 1, 2 ], 2); //should return 4

Upvotes: 0

Views: 193

Answers (3)

Nina Scholz
Nina Scholz

Reputation: 386550

Yor check is wrong, i is never smaller than zero for an index.

By the way, if you check against a value, you could use the name value instead of index, which leads to wrong assumptions and declare all variables in advance.

var lastIndexOf = function(array, value) {
        var i;
        for (i = array.length - 1; i >= 0; i--) {
            if (array[i] === value) {
                return i;
            }
        }
        return -1; // standard default value for not found indices
    };

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], 42)); // -1

A shorter approach with a while loop.

var lastIndexOf = function(array, value) {
        var i = array.length
        while (i--) {
            if (array[i] === value) {
                return i;
            }
        }
        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], 42)); // -1

Upvotes: 1

Christos
Christos

Reputation: 53958

You should change the check you make in the for statement. We start from the last index and we go down to the 0 index. So you loop while index >=0 and not when index<0.

I used different names for some parameters and arguments, in order to make the code more readable.

var lastIndexOf = function (array, number) {
  for (var index = array.length-1; index>=0; index--) {
    if (array[index] === number) {
        return index;
    }
  }
};


console.log(lastIndexOf([ 0, 1, 4, 1, 2 ], 1)); //should return 3

Upvotes: 1

Phiter
Phiter

Reputation: 14992

Your loop condition is wrong. i will never be less than 0 unless the array is empty.

Use this instead:

(i=array.length-1; i >= 0; i--) {

Upvotes: 1

Related Questions