Создание уникальных сочетаний из массивов на JS

Есть объект такого типа:

const a = {
  '123': ['asd', 'qwe', 'zxc'],
  '456': ['iop', 'jkl', 'bnm']
}

Необходимо привести его к такому виду:

const b = [
  '123_asd__456_iop',
  '123_asd__456_jkl',
  '123_asd__456_bnm',
  '...',
  '123_zxc__456_jkl',
  '123_zxc__456_bnm'
]

Ответы (1 шт):

Автор решения: vsemozhebuty

Вам нужна реализация алгоритма Cartesian product (Прямое произведение). Вариант реализации для неограниченного количества исходных наборов можно посмотреть, например, в одном из популярных репозиториев по Computer Science.

Только для начала нужно превратить ваш объект в массив массивов, в котором к каждому элементу будет добавлен «ярлычок» из ключа объекта. А в конце объединить сочетания в строки.

Пример, как приспособить реализацию по ссылке:

const a1 = {
  '123': ['asd', 'qwe', 'zxc'],
  '456': ['iop', 'jkl', 'bnm'],
};

const a2 = Object.entries(a1).map(
  ([key, values]) => values.map(value => `${key}_${value}`)
);

console.log(a2);

const cartesianProduct = (function () {
  let result;

  function cartesianProduct(sets, index, current) {
    if (index === sets.length) {
      return result.push(current.slice());
    }
    for (let i = 0; i < sets[index].length; i++) {
      current[index] = sets[index][i];
      cartesianProduct(sets, index + 1, current);
    }
  }

  return function (sets) {
    result = [];
    cartesianProduct(sets, 0, []);
    return result;
  };
}());

const a3 = cartesianProduct(a2).map(array => array.join('__'))

console.log(a3);

→ Ссылка