everblack
everblack

Reputation: 360

Why array.find() is not working as expected?

Morning ! I'm facing an issue on a freeNumberGenerator function with a basic find usage. The issue is that the first example of code can't return me a free number, if it takes an array like [0, 1, 2, 3] it will always return 0, considering that 0 is not part of the array arr argument. Looks like a basic usage as i said but i can't find [uhuh...] why.

Not Working :

public getFreeNumber(...arr: number[]): number {
        let freeNumber: number = 0;
        let isTaken: boolean = true;

        while (isTaken) {
            if (arr.find(n => n === freeNumber)) {
                ++freeNumber;
            } else {
                isTaken = false;
            }
        }
        return freeNumber;
    }

Working :

public getFreeNumber(...arr: number[]): number {
        let freeNumber: number = 0;
        let isTaken: boolean = true;

        while (isTaken) {
            if (arr.indexOf(freeNumber) !== -1) {
                ++freeNumber;
            } else {
                isTaken = false;
            }
        }
        return freeNumber;
    }

Working :

public getFreeId(arr: Array<IIdentifiable>): number {
        let freeId: number = 0;
        let isTaken: boolean = true;

        while (isTaken) {
            if (arr.find(a => a.id === freeId)) {
                ++freeId;
            } else {
                isTaken = false;
            }
        }
        return freeId;
    }

Upvotes: 3

Views: 11371

Answers (1)

Icepickle
Icepickle

Reputation: 12796

Well, potentially because Array.prototype.find returns the first number that matches your function. In case the number would 0, it would return 0 and this would be treated as falsy.

You could change the behavior by checking if the find method doesn't return undefined, like so (typescript changes)

public getFreeNumber(...arr: number[]): number {
    let freeNumber: number = 0;
    let isTaken: boolean = true;

    while (isTaken) {
        if (typeof arr.find(n => n === freeNumber) !== 'undefined') {
            ++freeNumber;
        } else {
            isTaken = false;
        }
    }
    return freeNumber;
}

and a sample javascript output would be something like this

function getFreeNumber(arr) {
  let freeNumber = 0;
  let isTaken = true;

  while (isTaken) {
    if (typeof arr.find(n => n === freeNumber) !== 'undefined') {
      ++freeNumber;
    } else {
      isTaken = false;
    }
  }
  return freeNumber;
}

console.log( getFreeNumber([0,1,2,3]) );

Upvotes: 3

Related Questions