2017-02-10 87 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

相關問題