Задать вопрос
@kotbasikcom

Как получить из массива все возможные пары элементов?

Есть массив ["a","b","c","d","e"]. Нужно получить в новый массив все возможные пары элементов.
a,b
a,c
b,a
c,a
b,c
c,b и т.д.
Получить в новый массив все возможные пары элементов без a,a; b,b; c,c и т.д.
Можно ли это сделать?
  • Вопрос задан
  • 609 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега JavaScript
Python, JS, WordPress, SEO, Bots, Adversting
Можно ли это сделать?

Можно, законом не запрещено.
Нужно получить все возможные пары элементов.

В каком виде? Предположу, что в виде пары в массиве (['a', 'b'], ['a', 'c'] итп), тогда можно так:
const arr = [ 'a', 'b', 'c', 'd', 'e' ];

const pairs = arr.flatMap((x, i) =>
  arr
    .map((y, j) => i !== j ? [ x, y ] : [])
    .filter((pair) => pair.length),
);

console.log(pairs);

/*
[
  [ 'a', 'b' ], [ 'a', 'c' ],
  [ 'a', 'd' ], [ 'a', 'e' ],
  [ 'b', 'a' ], [ 'b', 'c' ],
...
]
*/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F Куратор тега JavaScript
Рекурсия есть:

const combinations = (data, size) => size > 1
  ? Array.from(data, n => combinations(data, ~-size).map(m => [ n, ...m ])).flat()
  : Array.from(data, n => [ n ]);

Рекурсии нет:

const combinations = (data, size) =>
  Array.from({ length: data.length ** size }, (_, i) =>
    Array.from({ length: size }, (_, j) =>
      data[(i / (data.length ** (size - j - 1)) | 0) % data.length]
    )
  );

Применяем:

// ваш случай
combinations('abcde', 2)

// а вот, например, числа в интервале [0, 9999], представленные в виде массивов цифр
combinations([...Array(10).keys()], 4)

// или, интервал [0, 31], но в двоичном виде
combinations([ 0, 1 ], 5)

UPD. Вынесено из комментариев:

Выводит также a,a b,b c,c ... Мне это лишнее

Окей, вот элементы не повторяются:

const partialPermutation = (data, size) =>
  data.length < size
    ? null
    : (function get(permutation, result) {
        if (permutation.size === size) {
          result.push([...permutation]);
        } else {
          for (const n of data) if (!permutation.has(n)) {
            permutation.add(n);
            get(permutation, result);
            permutation.delete(n);
          }
        }

        return result;
      })(new Set, []);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы