Генерация полных (всех размеров) комбинаций массивов - PullRequest
0 голосов
/ 15 декабря 2018

Как создать полностью комбинации из нескольких массивов?

const source = [ ["a", "b", "c"], ["d", "e", "f"], ["g", "h", "i"] ];
const result = combination(source);

Нужен результат, как декартово произведение, но с комбинациями всех размеров:

["a"]
["a", "d"]
["a", "d", "g"]
...
["b"]
...
["b", "f", "i"]
...
["i"]

1 Ответ

0 голосов
/ 15 декабря 2018

Как насчет этого:

function cartesianProduct(arrArr) {
  if (arrArr.length === 0) return [];

  const [firstArr, ...restArrs] = arrArr;
  const partialProducts = cartesianProduct(restArrs || []);

  let ret = firstArr.map(elem => [elem]);
  ret = ret.concat(partialProducts);
  ret = ret.concat(partialProducts.reduce((acc, product) => {
    return acc.concat(firstArr.map(elem => [elem].concat(product)));
  }, []));

  return ret;
}
...