こういうときは問題を切り分けて考えましょう。一気に実装しようとすると混乱します。
1. 組み合わせを用意する
JavaScript
1let movieList = [0, 1, 2, 3, 4, 5, 6];
2
3// 組み合わせの用意
4let movieComb = movieList.map( n => {
5 return movieList
6 .map( m => [n, m] )
7 .filter( elm => elm[0] !== elm[1] );
8}).flat();
2重ループで回し、値が違うものだけをリストに追加します。上記では map
関数等を使って多少記述を楽にしていますが、 for
文で済ませる場合でも同じように考えることができます。
JavaScript
1let movieList = [0, 1, 2, 3, 4, 5, 6];
2
3// 組み合わせの用意
4let movieComb = [];
5for (let i = 0; i < movieList.length; i++) {
6 for (let j = 0; j < movieList.length; j++) {
7 if (movieList[i] !== movieList[j]) {
8 movieComb.push([movieList[i], movieList[j]]);
9 }
10 }
11}
2. シャッフルする
配列をシャッフルしてしまえばランダムに取り出すのと同じです。
JavaScriptで配列をシャッフルする方法 - Qiita
このページの内容がわかりやすいです。
JavaScript
1// シャッフルする
2// https://qiita.com/komaji504/items/62a0f8ea43053e90555a
3for (let i = movieComb.length - 1; i > 0; i--) {
4 const r = Math.floor(Math.random() * (i + 1));
5 const tmp = movieComb[i];
6 movieComb[i] = movieComb[r];
7 movieComb[r] = tmp;
8}
3. 取り出す
最後に取り出します。特筆すべきことはないです。
ここで movie1
や movie2
に代入するといいでしょう。
JavaScript
1let movie1, movie2;
2
3// 取り出す
4for (let i = 0; i < movieComb.length; i++) {
5 // alert(movieComb[i]);
6 document.write("<div>"+i+": "+movieComb[i]+"</div>");
7 movie1 = movieComb[i][0];
8 movie2 = movieComb[i][1];
9 // 以降movie1,2を用いた処理
10}
全体
JavaScript
1let movieList = [0, 1, 2, 3, 4, 5, 6];
2let movie1, movie2;
3
4// 組み合わせの用意
5let movieComb = movieList.map( n => {
6 return movieList
7 .map( m => [n, m] )
8 .filter( elm => elm[0] !== elm[1] );
9}).flat();
10
11console.log(movieComb); // 42個生成されてることをデバッガーから確認できます。
12
13// シャッフルする
14// https://qiita.com/komaji504/items/62a0f8ea43053e90555a
15for (let i = movieComb.length - 1; i > 0; i--) {
16 const r = Math.floor(Math.random() * (i + 1));
17 const tmp = movieComb[i];
18 movieComb[i] = movieComb[r];
19 movieComb[r] = tmp;
20}
21
22// 取り出す
23for (let i = 0; i < movieComb.length; i++) {
24 // alert(movieComb[i]);
25 document.write("<div>"+i+": "+movieComb[i]+"</div>");
26 movie1 = movieComb[i][0];
27 movie2 = movieComb[i][1];
28 // 以降movie1,2を用いた処理
29}
冒頭に述べたとおり、問題を切り分けることで簡単に解決できます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。