在Javascript中更改对象结构和属性

时间:2017-02-21 14:55:48

标签: javascript javascript-objects

我面临一个特殊的问题,我需要改变对象的结构,如:

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

进入这个:

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

我试过这样的事情:

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
        }
    }

但结果是一个只包含最后更改属性的对象:

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

请帮忙吗?

1 个答案:

答案 0 :(得分:3)

您可以使用reduce()返回新对象。

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)