Если вы просто хотите, два эл answer от Oriol должно все хорошо. Но если вы хотите что-то, что простирается до любого размера подгруппы, что-то подобное может сделать:
const permutations = (n, tokens, subperms = [[]]) =>
n < 1 || n > tokens.length ?
subperms :
R.addIndex(R.chain)((token, idx) => permutations(
n - 1,
R.remove(idx, 1, tokens),
R.compose(R.map, R.append)(token)(subperms)
), tokens);
permutations(2, [1, 2, 3, 4]);
//=> [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4],
// [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]]
permutations(3, [1, 2, 3, 4]);
//=> [[1, 2, 3], [1, 2, 4], [1, 3, 2], [1, 3, 4], [1, 4, 2], [1, 4, 3],
// [2, 1, 3], [2, 1, 4], [2, 3, 1], [2, 3, 4], [2, 4, 1], [2, 4, 3],
// [3, 1, 2], [3, 1, 4], [3, 2, 1], [3, 2, 4], [3, 4, 1], [3, 4, 2],
// [4, 1, 2], [4, 1, 3], [4, 2, 1], [4, 2, 3], [4, 3, 1], [4, 3, 2]]
Эта версия была слегка адаптирована из одного I presented в Ramda's Gitter room. Там я предположил, что это было перегружено, но это было для полных перестановок. Кажется уместным n-комбинации.
Вы можете увидеть это в действии на Ramda REPL.
Это изящно, но оно возвращает что-то отличное от того, что было запрошено, так как оно повторяет элементы. n-element последовательностей, взятых из списка. И это так же изящно, как я видел. –
Вы правы, Скотт. Этот ответ неверен, но интересен тем не менее. :) – davidchambers
Это работает с фильтром для удаления любых дубликаты – sa555