0

Here is what I wrote: (key in the headline is prop here)

var data = {
    dup_by: ['prop1', 'prop2', 'prop3'],
    prop1: ['val11', 'val12'],
    prop2: ['val21', 'val22'],
    prop3: ['val31', 'val32', 'val33'],
    test_obj: {},
    test_obj_arr: []
};

var dupRecursion = function(prop_index) {
      let prop_name = data.dup_by[prop_index]
      data[prop_name].forEach((value) => {
        data.test_obj[prop_name] = value
        console.log(prop_name)
        console.log(value)
        console.log(data.test_obj)
        if (prop_index == 0) {
          data.test_obj_arr = [data.test_obj, ...data.test_obj_arr]
          console.log(data.test_obj_arr)
        } else {
          dupRecursion(prop_index - 1)
        }
      })
      return;
    };

dupRecursion(data.dup_by.length - 1)

Here is the expected result:

data.test_obj_arr = [{prop1: 'val11', prop2: 'val21', prop3: 'val31'},
{prop1: 'val11', prop2: 'val21', prop3: 'val32'},
{prop1: 'val11', prop2: 'val21', prop3: 'val33'},
{prop1: 'val11', prop2: 'val22', prop3: 'val31'},
{prop1: 'val11', prop2: 'val22', prop3: 'val32'},
{prop1: 'val11', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val21', prop3: 'val31'},
{prop1: 'val12', prop2: 'val21', prop3: 'val32'},
{prop1: 'val12', prop2: 'val21', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val31'},
{prop1: 'val12', prop2: 'val22', prop3: 'val32'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'}]

There are some solutions for combinations of arrays instead of objects vals and props.

I've tried some changes in order but they all result in the same output:

data.test_obj_arr = [{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'},
{prop1: 'val12', prop2: 'val22', prop3: 'val33'}]

Since the logs are coming out as expected:

console.log(prop_name)
console.log(value)

But these aren't:

console.log(data.test_obj)
console.log(data.test_obj_arr)

I believe that the problem is in the assignment:

data.test_obj[prop_name] = value

Singularly it works, just not inside the recursion. Tried to use Object.Assign and it didn't work either.

All those functions, as much as I'm informed, are synced functions.

What am I missing?

nshem
  • 1
  • 3

1 Answers1

0

Create a 2D array of of each prop_x values. Then create a create a Cartesian product of the array. Loop through the combinations and create an object for each combination with dup_by as keys

const input = {
    dup_by: ["prop1", "prop2", "prop3"],
    prop1: ["val11", "val12"],
    prop2: ["val21", "val22"],
    prop3: ["val31", "val32", "val33"],
    test_obj: {},
    test_obj_arr: [],
}

const keys = input.dup_by,
      matrix = keys.map(k => input[k])

// https://stackoverflow.com/a/57597533/3082296
const combos = matrix.reduce((acc, curr, i) =>
  acc.flatMap(c => curr.map(n => [].concat(c, n)))
)

const createObject = (values) =>
  Object.fromEntries(
    keys.map((k, i) => [k, values[i]])
  )

const output = combos.map(createObject)

console.log("matrix: ", JSON.stringify(matrix))
console.log("combos: ", JSON.stringify(combos))
console.log(output)

If Object.fromEntries() is not supported, you can use reduce to create an object from an array of keys and values

const createObject = (values) =>
  keys.reduce((acc, k, i) => (acc[k] = values[i], acc), {})
adiga
  • 34,372
  • 9
  • 61
  • 83