2017-02-21 20 views
2

でのプロパティのように私は、オブジェクトの構造を変更する必要がある特定の問題に直面しています:私はこのような何かを試してみました変更オブジェクト構造とJavascript

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

:この中

customerPayload = { 
     name: 'Name must remain', 
     billing_address_street: 'Electric Avenue', 
     billing_address_number: 222, 
     shipping_address_street: 'Avenue 1', 
     shipping_address_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

! –

+1

オブジェクト 'customerPayload'は私のサーバで要求されたボディであり、プロパティ名を変更できません=/ – gcfabri

答えて

3

reduce()を使用すると、新しいオブジェクトを返すことができます。手動でそれをやっていない、それは私が思うのコードの4行を取るのはなぜ

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)

+0

ありがとう、これは完全に動作します。 – gcfabri

+0

文字列を分割するルールは何ですか?私は正規表現に慣れていない。これは 'invoice_template'という名前のプロパティも破っています。これは新しいオブジェクトのままであるべきです。 – gcfabri

+0

最後に '_'で文字列を壊します。 –

関連する問題