2016-10-09 2 views
0

私は多くの入れ子オブジェクトを持つ大きなJSオブジェクトを持っています。例えば:私は、オブジェクトを作成する必要がjavascriptオブジェクトのクローン部分

var A = { 
    'b': { 
     c: [1], 
     d: { 
      e: { 
       f: 'g' 
      } 
     } 
    } 
}; 

"B" は、オブジェクト "A" のように見えますが、配列 "BC" は、他の一つの項目含まれている必要があります

var B = { 
    'b': { 
     c: [1, 2], 
     d: { 
      e: { 
       f: 'g' 
      } 
     } 
    } 
}; 

オブジェクト「 "変更するべきではありません。

私はそれを行うには、2つの方法を知っている:

1つのディープクローンJSオブジェクト:私はクローンを作成する必要が

var B = JSON.parse(JSON.stringify(A)); // or with lodash: _.cloneDeep(A) 
B.b.c.push(2); 

2クローンのみオブジェクトと配列:

var B = Object.assign({}, A); 
B.b = Object.assign({}, B.b); 
B.b.c = B.b.c.slice(0); 
B.b.c.push(2); 

を私は最初の方法はリソースを大量に消費することです。私はすべてのオブジェクトを複製する必要はありません。 2番目の方法はコードが多すぎます。私の例では小さなオブジェクトがありますが、アプリケーションでは本当に大きなオブジェクトになる可能性があります。

最適な方法でオブジェクト "B"を作成するにはどうすればよいですか?

答えて

1

JSON.stringify/.parseあなたが言ったように、それは、オブジェクトをシリアル化と解析を必要とし、それは完全に最も効率的な方法ではありません、確かに深いクローン(簡単な)オブジェクトへの最も簡単な方法ですが。

幸いにも、ES6からは幸運にも物事が良くなっています。そしてESNextで、あなたもオブジェクトを広めることができます。もちろん

var B = { ...A }; 

を、そこb.cとあなたの問題はまだだが、それを手動で調整する必要があります。

var B = { ...A, b: { ...A.b, c: [1, 2] }}; 

ここでオブジェクトのスプレッド演算子のバベルのプラグインです: https://babeljs.io/docs/plugins/transform-object-rest-spread/

関連する問題