Задача
Я хотел бы сгенерировать все комбинации для подобного шаблону объекта, который может принимать несколько дочерних элементов, некоторые из которых определяют желаемый результат в виде массива. У этих детей тоже могут быть дети (ограничений практически нет).
Пример ввода
const input = {
a: [true, false],
b: ['first', 'second'],
c: {
d: [true, false]
}
};
Пример вывода
const output = [
{
a: true,
b: 'first',
c: {
d: true
}
},
{
a: true,
b: 'first',
c: {
d: false
}
},
{
a: true,
b: 'second',
c: {
d: true
}
},
{
a: true,
b: 'second',
c: {
d: false
}
},
//...
]
Вопрос
Что может быть функцией JavaScript для преобразования ввода в вывод?
Что было испробовано?
Я попытался взять исходную функцию из этого вопроса и сделать ее более совместимой с ES, но это не работает, если в объекте есть несколько дочерних элементов.
function combinations(input, keyIndex = 0, current = {}, result = []) {
const keys = Object.keys(input)
const key = keys[keyIndex]
const values = input[key]
for (const index in values) {
current[key] = values[index]
if (keyIndex + 1 < keys.length) {
combinations(input, keyIndex + 1, current, result)
} else {
result.push(JSON.parse(JSON.stringify(current)))
}
}
return result;
}