gcfabri
gcfabri

Reputation: 574

Change Object Structure and Properties in Javascript

I am facing a particular problem that I need to change the structure of a object like:

customerPayload = {
      name: 'Name must remain',
      billing_address_street: 'Electric Avenue',
      billing_address_number: 222,
      shipping_address_street: 'Avenue 1',
      shipping_address_number: 1337
    };

into this:

customerPayload = {
        name: 'Name must remain',
        billing_address: {
            street: 'Electric Avenue',
            number: 222
        },
        shipping_address: {
            street: 'Avenue 1',
            number: 1337
        }
    };

I tried something like this:

for (var p in customerPayload) {
        if (customerPayload.hasOwnProperty(p)) {
            if (p.includes('billing')) {      
                var b = p.substr(0, 15) + '.' + p.substr(15 + 1);           
                var bAddress = b.split('.')[0];
                var childProp = b.split('.')[1];
                newCustomerPayload[bAddress] = {
                  [childProp]: customerPayload[p]
                };
            }
            // else if shipping ... same thing
        }
    }

But the result is an object with only the last changed properties:

 customerPayload = {
    billing_address: {
        number: 222
    },
    shipping_address: {
        street: 'Avenue 1'
    }
 };

Please, any help?

Upvotes: 4

Views: 2619

Answers (1)

Nenad Vracar
Nenad Vracar

Reputation: 122027

You can use reduce() to return new object.

var data = {
  name: 'Name must remain',
  billing_address_street: 'Electric Avenue',
  billing_address_number: 222,
  shipping_address_street: 'Avenue 1',
  shipping_address_number: 1337
};

var result = Object.keys(data).reduce(function(r, e) {
  if (!e.match('_')) r[e] = data[e]
  else {
    var key = e.split(/_([^_]*)$/)
    if (!r[key[0]]) r[key[0]] = {}
    r[key[0]][key[1]] = data[e]
  }
  return r;
}, {})

console.log(result)

Upvotes: 3

Related Questions