2017-06-22 4 views
-1

私は、誤った回答に対して一連の回答をフィルタリングし、元の配列から2件だけを削除しようとしています。配列をフィルタリングし、元の配列からインデックスへの参照を保持しますか?

コード:

var answers = [ 
    {text: "foo", isCorrect: false}, 
    {text: "bar", isCorrect: true}, 
    {text: "foo2", isCorrect: false}, 
    {text: "bar2", isCorrect: false} 
] 
var inCorrect = answers.filter((v, i) => !v.isCorrect); 

inCorrect配列から2つのランダムな答えを選択して解答配列からインデックスを取得します。

+0

'i'があなたの' filter'コールバックでインデックスです。 –

+1

あなたのデータはあなたのビューにどのように縛られていますか?回答が「無効」になっているかどうかを判断するにはどうすればよいですか?回答には、UI上の「アクティブ」または「無効」のプロパティが表示されますか? – mhodges

+0

@mhodgesはい私は子供のコンポーネントに小道具としてそれらを渡す

答えて

1

2つのランダムな不正解と一緒に正しい答えを選択するには、次のコードを使用することができます。これにより、元の配列はそのまま残り、元の配列のオブジェクトへの参照が返されます。

var answers = [ 
 
    {answer: "foo", isCorrect: false}, 
 
    {answer: "bar", isCorrect: true}, 
 
    {answer: "foo2", isCorrect: false}, 
 
    {answer: "bar2", isCorrect: false} 
 
] 
 
function getRandom (ceiling) { 
 
    return Math.floor(Math.random() * (ceiling || 1)); 
 
} 
 
function fiftyFifty (answers) { 
 
    var correct = answers.find(answer => answer.isCorrect); 
 
    var incorrectAnswers = answers.filter(answer => !answer.isCorrect); 
 
    // grab n answers unless there are less than n incorrect answers to choose from 
 
    var numberOfIncorrects = Math.min(2, incorrectAnswers.length); 
 
    var incorrectsToUse = []; 
 
    for (var i = 0; i < numberOfIncorrects; i++) { 
 
     let randomIndex = getRandom(incorrectAnswers.length); 
 
     // splice elem out of array so it doesn't get randomly selected twice 
 
     incorrectsToUse.push(incorrectAnswers.splice(randomIndex, 1)[0]); 
 
    } 
 
    return [correct].concat(incorrectsToUse); 
 
} 
 

 
console.log(fiftyFifty(answers)); 
 
console.log(fiftyFifty(answers)); 
 
console.log(fiftyFifty(answers));

+0

ありがとう@mhodges、閉じる!私は2つの誤った答えを得る必要があります。 1つは正しく、1つは間違っています。 :) –

+0

@BrainYoungああ、ちゃっかり。簡単な修正。スタンバイ – mhodges

+0

@BrainYoung更新。しかし、どのように出力したいか分からない。あなたはそれらを一つの配列に入れたいのですか、 '{correct:obj、incorrect:[obj、obj]}'を使ってオブジェクトに入れたいのですか、あるいは誤った答えを '[正しい、 [間違っている、間違っている]] '? – mhodges

1

answersに割り当て直すだけですか?

var answers = [ 
 
    {val : "foo", isCorrect: false}, 
 
    {val : "bar", isCorrect: true}, 
 
    {val : "foo2", isCorrect: false}, 
 
    {val : "bar2", isCorrect: false} 
 
]; 
 
answers = answers.filter(v => v.isCorrect); 
 

 
console.log(answers);

+0

いいえ回答配列を変更すると状態が変わります! –

+0

@BrainYoung私は混乱しています。答えへの参照を維持し、 'answers'から誤った答えを削除し、' answers'配列を変更しないとしますか? – mhodges

+0

私は誤った回答(3つの回答)の新しい配列を持っているし、それらから2つのランダムな要素を選択します。これらの2つの答えは、UIで消えてしまうので、回答を変更することはできません。 –

関連する問題