目的
TypeScriptで配列内の2つの要素の組み合わせをワンライナーでやります。
3つ以上は他の記事を参考にしてください。
実装
const arr = [...Array(5).keys()];
const comb = arr.map((v, i) =>
arr.map((g, j) =>
i < j ? [v, g] : undefined
).filter((coupling): coupling is number[] => coupling !== undefined)
).flat();
内部のmap
ではnumber[]とundefinedの二つが生成されるため、filterでundefinedをはじきつつ型ガードしています。
参考
出来ているか見てみましょう。
console.log(comb);
[
[ 0, 1 ],
[ 0, 2 ],
[ 0, 3 ],
[ 0, 4 ],
[ 1, 2 ],
[ 1, 3 ],
[ 1, 4 ],
[ 2, 3 ],
[ 2, 4 ],
[ 3, 4 ]
]
出来ていますね!
おまけ
const 虹ヶ咲学園スクールアイドル同好会: string[] = [
'高咲侑',
'上原歩夢',
'中須かすみ',
'桜坂しずく',
'朝香果林',
'宮下愛',
'近江彼方',
'優木せつ菜',
'エマ・ヴェルデ',
'天王寺璃奈',
'三船栞子',
'ミア・テイラー',
'鐘嵐珠'
];
const カップリング = 虹ヶ咲学園スクールアイドル同好会.map((v: string, i: number) =>
虹ヶ咲学園スクールアイドル同好会.map((g: string, j: number) =>
i < j ? [v, g] : undefined
).filter((coupling): coupling is string[] => coupling !== undefined)
).flat();
console.log(カップリング);
[
[ '高咲侑', '上原歩夢' ],
[ '高咲侑', '中須かすみ' ],
[ '高咲侑', '桜坂しずく' ],
[ '高咲侑', '朝香果林' ],
[ '高咲侑', '宮下愛' ],
[ '高咲侑', '近江彼方' ],
[ '高咲侑', '優木せつ菜' ],
[ '高咲侑', 'エマ・ヴェルデ' ],
[ '高咲侑', '天王寺璃奈' ],
[ '高咲侑', '三船栞子' ],
[ '高咲侑', 'ミア・テイラー' ],
[ '高咲侑', '鐘嵐珠' ],
[ '上原歩夢', '中須かすみ' ],
[ '上原歩夢', '桜坂しずく' ],
[ '上原歩夢', '朝香果林' ],
[ '上原歩夢', '宮下愛' ],
[ '上原歩夢', '近江彼方' ],
[ '上原歩夢', '優木せつ菜' ],
[ '上原歩夢', 'エマ・ヴェルデ' ],
[ '上原歩夢', '天王寺璃奈' ],
[ '上原歩夢', '三船栞子' ],
[ '上原歩夢', 'ミア・テイラー' ],
[ '上原歩夢', '鐘嵐珠' ],
[ '中須かすみ', '桜坂しずく' ],
[ '中須かすみ', '朝香果林' ],
[ '中須かすみ', '宮下愛' ],
[ '中須かすみ', '近江彼方' ],
[ '中須かすみ', '優木せつ菜' ],
[ '中須かすみ', 'エマ・ヴェルデ' ],
[ '中須かすみ', '天王寺璃奈' ],
[ '中須かすみ', '三船栞子' ],
[ '中須かすみ', 'ミア・テイラー' ],
[ '中須かすみ', '鐘嵐珠' ],
[ '桜坂しずく', '朝香果林' ],
[ '桜坂しずく', '宮下愛' ],
[ '桜坂しずく', '近江彼方' ],
[ '桜坂しずく', '優木せつ菜' ],
[ '桜坂しずく', 'エマ・ヴェルデ' ],
[ '桜坂しずく', '天王寺璃奈' ],
[ '桜坂しずく', '三船栞子' ],
[ '桜坂しずく', 'ミア・テイラー' ],
[ '桜坂しずく', '鐘嵐珠' ],
[ '朝香果林', '宮下愛' ],
[ '朝香果林', '近江彼方' ],
[ '朝香果林', '優木せつ菜' ],
[ '朝香果林', 'エマ・ヴェルデ' ],
[ '朝香果林', '天王寺璃奈' ],
[ '朝香果林', '三船栞子' ],
[ '朝香果林', 'ミア・テイラー' ],
[ '朝香果林', '鐘嵐珠' ],
[ '宮下愛', '近江彼方' ],
[ '宮下愛', '優木せつ菜' ],
[ '宮下愛', 'エマ・ヴェルデ' ],
[ '宮下愛', '天王寺璃奈' ],
[ '宮下愛', '三船栞子' ],
[ '宮下愛', 'ミア・テイラー' ],
[ '宮下愛', '鐘嵐珠' ],
[ '近江彼方', '優木せつ菜' ],
[ '近江彼方', 'エマ・ヴェルデ' ],
[ '近江彼方', '天王寺璃奈' ],
[ '近江彼方', '三船栞子' ],
[ '近江彼方', 'ミア・テイラー' ],
[ '近江彼方', '鐘嵐珠' ],
[ '優木せつ菜', 'エマ・ヴェルデ' ],
[ '優木せつ菜', '天王寺璃奈' ],
[ '優木せつ菜', '三船栞子' ],
[ '優木せつ菜', 'ミア・テイラー' ],
[ '優木せつ菜', '鐘嵐珠' ],
[ 'エマ・ヴェルデ', '天王寺璃奈' ],
[ 'エマ・ヴェルデ', '三船栞子' ],
[ 'エマ・ヴェルデ', 'ミア・テイラー' ],
[ 'エマ・ヴェルデ', '鐘嵐珠' ],
[ '天王寺璃奈', '三船栞子' ],
[ '天王寺璃奈', 'ミア・テイラー' ],
[ '天王寺璃奈', '鐘嵐珠' ],
[ '三船栞子', 'ミア・テイラー' ],
[ '三船栞子', '鐘嵐珠' ],
[ 'ミア・テイラー', '鐘嵐珠' ]
]
あ^~