2017-01-18 13 views
2

for-loopで配列にランダムなインデックスを追加する機能を作っていますが、値は常に異なる必要がありますが、何らかの理由で(関数呼び出し) unique - 配列と同じ値をフィルタリングしようとしていますunique - 配列unique -arrayとオリジナル - 同じ長さの配列 - unique - 配列の長さがunique - 配列の長さよりも小さい - answerIdの値が変更されます。しかし、これらの配列は、同じ値がanswerId -arrayに入っていても、実行が残りのfor-loops(for-loopsはかなりのハックコード)に渡すことはできません。私が間違っていることは何ですか?申し訳ありませんが私の英語のスキルが良くない場合。配列内に同じランダム値を追加するのを防ぐ

getJSONData(){ 

    var answerId = [null, null, null, null]; 
    var length = Object.keys(Company.person).length; 

    for(var i = 0; i <= answerId.length - 1; i++){ 
    answerId[i] = [Math.floor(Math.random() * length)] 

    } 

    let unique = Array.from(new Set(answerId)) 
    console.log(unique.length) 

    if (unique.length < answerId.length){ 
    for(var i = 0; i <= answerId.length - 1; i++){ 
     answerId[i] = [Math.floor(Math.random() * length)] 
    } 
    console.log("new values 1") 
    unique = Array.from(new Set(answerId)) 

    if (unique.length < answerId.length){ 
     for(var i = 0; i <= answerId.length - 1; i++){ 
     answerId[i] = [Math.floor(Math.random() * length)] 
     } 
     console.log("new values 2") 
     unique = Array.from(new Set(answerId)) 

     if (unique.length < answerId.length){ 
     for(var i = 0; i <= answerId.length - 1; i++){ 
      answerId[i] = [Math.floor(Math.random() * length)] 
     } 
     console.log("new values 3") 
     unique = Array.from(new Set(answerId)) 

     if (unique.length < answerId.length){ 
      for(var i = 0; i <= answerId.length - 1; i++){ 
      answerId[i] = [Math.floor(Math.random() * length)] 
      } 
      console.log("new values 4") 
     } 
     } 
    } 
    } 

    var personArray = [Company.person[answerId[0]].firstName + ' ' + Company.person[answerId[0]].lastName, Company.person[answerId[1]].firstName + ' ' + Company.person[answerId[1]].lastName, Company.person[answerId[2]].firstName + ' ' + Company.person[answerId[2]].lastName, Company.person[answerId[3]].firstName + ' ' + Company.person[answerId[3]].lastName]; 
    return personArray; 
} 
+0

'JSON-indexes'何ですか? [JSON](http://json.org/)は、シリアル化されたデータを表す文字列です。 –

+0

私はJson-mentioningを質問から削除しました。 –

+0

データを追加することもできます。 –

答えて

1

Setsizeというプロパティを直接使用して、結果セットの望ましいサイズを確認できます。

var array = [0, 1, 42, 17, 22, 3, 7, 9, 15, 35, 20], 
 
    unique = new Set; 
 

 
while (unique.size < 4) { 
 
    unique.add(Math.floor(Math.random() * array.length)); 
 
} 
 

 
console.log([...unique]); // indices

そうしないと、ハッシュテーブルを使用することができます。

var array = [0, 1, 42, 17, 22, 3, 7, 9, 15, 35, 20], 
 
    unique = {}, 
 
    id = [], 
 
    i; 
 

 
while (id.length < 4) { 
 
    i = Math.floor(Math.random() * array.length); 
 
    if (!unique[i]) { 
 
     id.push(i); 
 
     unique[i] = true; 
 
    } 
 
} 
 

 
console.log(id);

+0

私はSetオブジェクトを使用しようとしましたが動作しません、同じ値があります。 '.add'は動作しますが、' .has'は動作しません。私はSetがReact-Nativeで完全にサポートされていないと強く信じています。 –

+0

'size'は動作しますか?私は '持っている'を使っていない。 –

+0

サイズは機能しません。しかし、値が一意でなくても常に4を返します。 –

1

私はあなたの問題を理解していたので、配列からN個のランダムな値を取得する必要があります。値は一意でなければなりません。配列をシャッフルして最初のN個の値を取得するだけです。

関連する問題