Kiran LM
Kiran LM

Reputation: 1379

Rearrange dynamic Object to form a structured Object

I have an Object like this:

const val = {"abc":{"1":1, "2":6,"3":5},"def":{"1":3, "2":4,"3":8},"xyz":{"1":5, "2":6,"3":7}}

I want to transform the object data like below:

[{"abc":1,"def":3,"xyz":5},{"abc":6,"def":4,"xyz":6}, ...]

All the values are dynamic, any number of inner object may be there

I have tried like this:

const val = {"abc":{"1":1, "2":6,"3":5},"def":{"1":3, "2":4,"3":8},"xyz":{"1":5, "2":6,"3":7}}

let dataObj = {};
let secondArr = [];
let dataArr =[]
Object.entries(val).map(firstObj=>{
    Object.entries(firstObj[1]).forEach(secondObj => {
  dataObj={[firstObj[0]]:secondObj[1]};
      secondArr.push(dataObj);
    })
  dataArr.push(secondArr)
})

console.log(dataArr)

Can anyone tell me a solution for this? Thanks in advance

Upvotes: 1

Views: 54

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386728

You could iterate the entries of the objects and take the inner keys as indices of the array with new objects with outer key and value.

var data = { abc: { 1: 1, 2: 6, 3: 5 }, def: { 1: 3, 2: 4, 3: 8 }, xyz: { 1: 5, 2: 6, 3: 7 } },
    result = Object
        .entries(data)
        .reduce((r, [k, o]) => {
            Object.entries(o).forEach(([i, v]) =>
                Object.assign(r[i - 1] = r[i - 1] || {}, { [k]: v }));
            return r;
        }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 2

Related Questions