2017-02-10 14 views
2

朝!私はfreeNumberGenerator関数の基本的なfindの使い方に関する問題に直面しています。問題は、コードの最初の例が私に空き数値を返すことができないということです。0が配列arr引数の一部ではないことを考慮して、0を常に返す[0, 1, 2, 3]のような配列を取ると、私が言ったように基本的な使用法のように見えますが、私は[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方法がそう(typescriptですが変化する)のように、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; 
} 

、出力はこの

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]));
ようなものになるだろうjavascriptのサンプルを動作を変更することができ

+0

私は今、あなたの応答を考えて、最後のものとの違い例えば、それは私にオブジェクト 'IIdentifiable'を返し、id値、' 0'自体は返しません。私は再びドキュメンテーションを読んでいたはずです...そして、それを行う最も効率的な方法は何ですか? 'indexOf'(2番目の例)? – everblack

+1

'find'は完全に有効なコマンドだと思いますが、パフォーマンスに大きな違いがあるとは思っていません(どのようなデータをサポートするべきかもわかりません)。 'find'と' indexOf'はあなたのすべての値を連続して繰り返します。もしパフォーマンスが必要で、たくさんの価値があると思ったら、それをオブジェクトにマップし、そのプロパティがマッピングされたオブジェクトに存在するかどうかを調べて空き数を検索することをお勧めします(これは大規模な配列は、完全な配列を検索し続けることができないため) – Icepickle

関連する問題