[js]複数の配列の組み合わせを作る

データが膨大になりやすいからどうなんでしょうね。

どういうことか

例えるならサイコロを複数回振った際に出る目の組み合わせ一覧みたいなことをしたい。

例えばこういうのがあるとして

ary01 = ['a','b','c'];
ary02 = [1,2,3];
ary03 = ['あ','い','う'];

こんなのを作りたい。

aryResult = [
    ['a',1,'あ'],
    ['a',1,'い'],
    ['a',1,'う'],
    ['a',2,'あ'],
    ['a',2,'い'],
    ['a',2,'う'],
    ['a',3,'あ'],
    ['a',3,'い'],
    ['a',3,'う'],
    ⋮
    ['c',3,'う'],
];

3x3x3の時点で27パターンできるわけで、手打ちなんかしてられるかよというね。

参考

なんて検索したら良いかわからなかったんだけど、なんとなくでヒットしてくれて助かった。

配列の組み合わせの作成 - Qiita
概要複数の配列の組み合わせを作成。ex. 要素数3の配列2つを組み合わせる場合、3×3=9通りの組み合わせが入った配列が作られる。渡す配列の数は任意。配列の要素数も任意。基本forEac…

こんな感じ

参考の内容から全く逸れないんだけど、使い方的な意味合いで。

const
    ary01 = [0,0,0,0,0],
    ary02 = [0,0,0,0,0],
    ary03 = [0,0,0,0,0],
    ary04 = [0,0,0,0,0],
    ary05 = [0,0,0,0,0],
    ary06 = [0,0,0,0,0],
    result = [];

ary01.forEach(v1 => {
    ary02.forEach(v2 => {
        ary03.forEach(v3 => {
            ary04.forEach(v4 => {
                ary05.forEach(v5 => {
                    ary06.forEach(v6 => {
                        result.push([v1, v2, v3, v4, v5, v6]);
                    })
                })
            })
        })
    })
})

console.log('result:',result);
console.log('result.length:',result.length);

配列の数だけ入れ子になりまくってるのが正直キモい。
ある程度の数までは良いんだけど、多くなってくるとチェックを目視でやってくのがしんどくなってくる。

関数として作成されたこれはすごい。

const makeComb = function(...array) {
    const make = (arr1, arr2) => {
        if (arr1.length === 0) {
            return arr2;
        }
        return arr1.reduce((arr, v1) => {
            arr2.forEach(v2 => {
                const group = [].concat(v1, v2);
                arr.push(group);
            });
            return arr;
        }, []);
    };
    return array.reduce(make, []);
};

const
    arr1 = [0,0,0],
    arr2 = [0,0,0],
    arr3 = [0,0,0],
    arr4 = [0,0,0],
    arr5 = [0,0,0],
    arr = makeComb(arr1, arr2, arr3, arr4, arr5);

console.log('arr:',arr);
console.log('arr.length:',arr.length);

constで宣言している配列(arr1~arr6)と、その配列を指定した変数(arr)の部分を編集すれば済む。こちらの方が楽ですね。

楽だけど、変数名「arr」を変えちゃいけないから注意。
汎用性考えたらこの部分は可変にしたいですね。

とりあえずコピペで導入すると意味が分からんことになるので、触る前に解説をちゃんと読んで何がどうなってるか理解したほうが無難。

どっちも配列の宣言位置を変えると壊れるので注意。

コメント

タイトルとURLをコピーしました