Создание уникальных сочетаний из массивов на 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);