Reputation: 360
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
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