2017-02-10 86 views
2

早上好!我在freeNumberGenerator函数中遇到了一个基本查找用法的问题。问题是代码的第一个例子不能返回给我一个空闲数字,如果它需要一个像[0, 1, 2, 3]这样的数组,它将总是返回0,因为0不是数组arr参数的一部分。看起来像我说的基本用法,但我找不到[uhuh ...]为什么。为什么array.find()不能按预期工作?

不工作:

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

回答

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

+0

哦,我现在看到了,所以考虑到你的回应,与上次的区别例如,它返回一个对象'IIdentifiable'而不是id值,'0'本身。我应该再次阅读文档...什么是最有效的方式来使用/使用? 'indexOf'(第二个例子)? – everblack

+1

我认为'find'在那里是一个完全有效的命令,我并不认为性能有如此大的差异(我也不知道你应该支持哪种数据)。 'find'和'indexOf'都会连续迭代所有的值。如果它需要高性能,并且你期待很多值,我宁愿建议你将它映射到一个对象中,然后通过检查映射对象上是否存在该属性来搜索空闲数字(这会更快大型数组,因为它不会继续搜索整个数组) – Icepickle

相关问题