Rey
Rey

Reputation: 1433

Converting to Correct Object Format from Array

I am aware of options like the spread operator and Object.assign() when it comes to converting an array to an object, however, I am having difficulty figuring out how to format the final object in the format I need.

My original array looks like this:

let propsArray = [ { id: '1' },
  { 'name.first': 'john' },
  { 'name.last': 'smith' } ]

The object I want from this data needs to look like this:

{
  "id" : 1,
  "name" : {
      "first" : "john",
      "last" : "smith"
  }
}

What I've tried so far, using object.assign(), ends up adding numbers as property keys in the resulting object, which is clearly not what I'm looking for:

  let finalObj = Object.assign({}, propsArray);

How can I get the resulting object formatted the way I need here?

Upvotes: 2

Views: 71

Answers (2)

Ghoul Ahmed
Ghoul Ahmed

Reputation: 4806

Try this:

const data = [
  {
    "id": "1"
  },
  {
    "name.first": "john"
  },
  {
    "name.last": "smith"
  }
]

const result = Object.entries(Object.assign({}, ...data))
.reduce((acc,[k,v])=>{
    [first, last] = k.split('.');
    if (!last) {
        acc[k] = v
    } else {
        acc[first] = acc[first] || {};
        acc[first][last] = v;
    }
    return acc
}, {})

console.log(result);

Upvotes: 0

Nina Scholz
Nina Scholz

Reputation: 386578

You need a deeper look into the object and take the splitted key and reduce them by taking an object with the property or an empty object. At the end assign the value.

var data = [{ id: '1' }, { 'name.first': 'john' }, { 'name.last': 'smith' }],
    result = data.reduce((r, o) => {
        Object.entries(o).forEach(([k, v]) => {
            var keys = k.split('.'),
                last = keys.pop();
            keys.reduce((q, k) => q[k] = q[k] || {}, r)[last] = v;        
        });
        return r;
    }, {});

console.log(result);

Upvotes: 6

Related Questions