Javascript
1var array_A = [100, 105, 200, 306, 505]; 2var array_B = ["A", "B", "C", "D", "E"]; 3 4var array_BOX = [ 5 array_A , 6 array_B 7];
2つの配列「array_A 」、「array_B 」を新規配列「array_BOX 」に格納して二次元配列化した物の値の並びをランダムに替えたいです。
その際に現時点での配列の順番の対になる値(一次元の[0]である"100"と二次元の[0]である"A")はランダムに並び替えた後もセットとして扱いたいため、
一次元と二次元の値の対関係はそのままで配列の値を並び替えを行える方法のご教授をお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
二次元配列
配列のシャッフルには Fisher–Yates shuffle を使用しています。
JavaScript
1function arrayShuffle (array) { 2 var k, t, len; 3 4 len = array.length; 5 6 if (len < 2) { 7 return array; 8 } 9 10 while (len) { 11 k = Math.floor(Math.random() * len--); 12 t = array[k]; 13 array[k] = array[len]; 14 array[len] = t; 15 } 16 17 return array; 18} 19 20var array_A = [100, 105, 200, 306, 505]; 21var array_B = ["A", "B", "C", "D", "E"]; 22var array_AB = []; 23 24for (var i = 0, len = array_A.length; i < len; ++i) { 25 array_AB.push([array_A[i], array_B[i]]); 26} 27 28arrayShuffle(array_AB); 29console.log(JSON.stringify(array_AB));
new Map
最初はarray_Aの値をキーとしてarray_Bを代入する連想化を試みたのですが、できなかったため上記の形となっております。
オブジェクト初期化子のキー/プロパティ値には順番の概念がない為、不可能ですが、new Map
ならば可能です。
JavaScript
1function arrayShuffle (array) { 2 var k, t, len; 3 4 len = array.length; 5 6 if (len < 2) { 7 return array; 8 } 9 10 while (len) { 11 k = Math.floor(Math.random() * len--); 12 t = array[k]; 13 array[k] = array[len]; 14 array[len] = t; 15 } 16 17 return array; 18} 19 20var array_A = [100, 105, 200, 306, 505]; 21var array_B = ["A", "B", "C", "D", "E"]; 22var array_AB = []; 23 24for (var i = 0, len = array_A.length; i < len; ++i) { 25 array_AB.push([array_A[i], array_B[i]]); 26} 27 28arrayShuffle(array_AB); 29 30var map = new Map(array_AB); 31console.log(JSON.stringify([...map.entries()]));
先の二次元配列のコードに new Map
を付け加えただけのコードです。
キー、値の列挙は Map#entries
以外にも Map#forEach
もあるので、配列と同じ感覚で扱えます。
Re: sika さん
投稿2017/06/21 01:34
編集2017/06/21 01:54総合スコア18194
0
1つのデータ構造として扱った方がいいです。
場合によっては、下記オブジェクト形式よりもクラス化するのも考慮されたほうがいいかもしれません。
javascript
1// データ形式の見直し 2var array_A = [100, 105, 200, 306, 505]; 3var array_B = ["A", "B", "C", "D", "E"]; 4// 5var list = [ 6 { 7 dataA:100, 8 dataB:"A" 9 }, 10 11 { 12 dataA:105, 13 dataB:"B" 14 }, 15 16 { 17 dataA:200, 18 dataB:"C" 19 }, 20 { 21 dataA:306, 22 dataB:"D" 23 }, 24 25 { 26 dataA:505, 27 dataB:"E" 28 } 29]; 30 31shuffle(list); 32 33// シャッフル関数定義 34function shuffle(array) { 35 var n = array.length, t, i; 36 while (n) { 37 i = Math.floor(Math.random() * n--); 38 t = array[n]; 39 array[n] = array[i]; 40 array[i] = t; 41 } 42 return array; 43} 44
####追記
シャッフルについては、think49さんが仰っている「 Fisher–Yates shuffle 」を利用しています。
投稿2017/06/21 01:09
編集2017/06/21 02:36総合スコア1013
0
こういう組み合わせで管理してはいけないのでしょうか?
javascript
1var a = [100, 105, 200, 306, 505]; 2var b = ["A", "B", "C", "D", "E"]; 3var c = []; 4a.forEach(function(i,j){ 5 c.push({a:i,b:b[j]}); 6}); 7console.log(c); 8
投稿2017/06/21 01:08
総合スコア117448
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/21 05:14 編集

0
var a = [100, 105, 200, 306, 505]; var b = ["A", "B", "C", "D", "E"]; var c = a.map(function (value, index) { return [a[index], b[index]]; }) .sort(function (a, b) { // 簡易のランダム入れ替え return Math.random() - .5; }); console.log(c);
修正前のコード
var a = [100, 105, 200, 306, 505]; var b = ["A", "B", "C", "D", "E"]; var c = a.map(function (value, index) { return index; }) .sort(function (a, b) { // 簡易のランダム入れ替え return Math.random() - .5; }) .map(function (value) { return [a[value], b[value]]; }); console.log(c);
投稿2017/06/21 01:26
編集2017/06/21 01:57
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/21 05:09

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。