为什么array.find()没有按预期工作?

时间:2017-02-10 09:47:16

标签: javascript typescript

早上好!我在freeNumberGenerator函数上面临一个基本查找用法的问题。问题是,代码的第一个示例无法返回一个空闲数字,如果它需要[0, 1, 2, 3]之类的数组,它将始终返回0,因为0不是数组arr参数的一部分。看起来像我说的基本用法,但我找不到[uhuh ...]为什么。

不工作:

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;
    }

工作:

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;
    }

工作:

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;
    }

1 个答案:

答案 0 :(得分:2)

好吧,可能因为Array.prototype.find返回与您的函数匹配的第一个数字。如果该号码为0,则会返回0,这将被视为falsy

您可以通过检查find方法是否不返回undefined来更改行为,如此(打字稿更改)

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;
}

并且示例javascript输出将是这样的

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]) );