2017-01-11 15 views
10

मैं एक वस्तु a उस तरह की है। मैं ऐसा करते हैं तो:Object.assign-ओवरराइड नेस्ट संपत्ति

const b = Object.assign({}, a, { 
    user: { 
    groups: {} 
    } 
}); 

bb.user.groups को छोड़कर किसी अन्य संपत्ति नहीं है, अन्य सभी नष्ट हो जाती हैं। Object.assign के साथ, अन्य सभी को खोए बिना, केवल घोंसला वाली संपत्ति को बदलने के लिए कोई ES6 तरीका है?

+2

आईएमओ ऐसा लगता है कि 'ऑब्जेक्ट.साइन' क्या है। यह आपके द्वारा प्रदान की गई नई वस्तु के साथ 'उपयोगकर्ता' संपत्ति को बदल रहा है। यदि यह एकमात्र चीज है जिसे आप बदलना चाहते हैं तो आप बस 'b.user.groups =/* value */'क्यों नहीं करते हैं? – taguenizy

उत्तर

23

कुछ मैं एक समाधान है कि इस तरह बहुत अच्छा लग रहा है मिल सकता है की कोशिश के बाद:

const b = Object.assign({}, a, { 
    user: { 
    ...a.user, 
    groups: 'some changed value' 
    } 
}); 

यह उत्तर और अधिक पूरा करने के लिए यहां एक छोटा नोट:

const b = Object.assign({}, a) 

अनिवार्य रूप में ही है:

const b = { ...a } 

के बाद से यह सिर्फ प्रतियां सभी एक नया वस्तु को a (...a) के गुणों। तो लिखा ऊपर कर सकते हैं के रूप में:

const b = { 
    ...a,   //copy everything from a 
    user: {  //override the user property 
     ...a.user, //same sane: copy the everything from a.user 
     groups: 'some changes value' //override a.user.group 
    } 
} 
6

आप इसे इस तरह से बदल सकते हैं,

const b = Object.assign({}, a, { 
    user: Object.assign({}, a.user, { 
      groups: {} 
     }) 
}); 

या बस करते हैं,

const b = Object.assign({}, a); 
b.user.groups = {}; 
+2

'b.user.groups' को म्यूट न करें, 'उपयोगकर्ता' को बी और ए में साझा किया जाता है! – borovsky

3

Object.assign() विधि लक्ष्य वस्तु के लिए एक या अधिक स्रोत वस्तुओं से सभी गणनीय खुद गुण के मूल्यों की प्रतिलिपि करने के लिए किया जाता है। यह लक्ष्य वस्तु वापस कर देगा।

असाइन विधि स्रोत ऑब्जेक्ट से प्रतिलिपि बनाकर एक नई वस्तु बना देगा, यदि आप स्रोत ऑब्जेक्ट में बाद में कोई विधि बदलते हैं तो यह समस्या नई ऑब्जेक्ट पर दिखाई नहीं देगी।

उपयोग बनाने के()

Object.create() विधि निर्दिष्ट प्रोटोटाइप वस्तु और गुण के साथ एक नई वस्तु बनाता है।

const b = Object.create(a) 
b.user.groups = {} 
// if you don't want the prototype link add this 
// b.prototype = Object.prototype 

इस तरह आप प्रोटोटाइप के माध्यम से एक से जुड़ा हुआ है और यदि आप किसी भी परिवर्तन एक में यह ख में परिलक्षित होगा, और ख में कोई परिवर्तन करने के लिए एक

+0

यह वास्तव में एक दिलचस्प बात है, लेकिन इस मामले में मुझे स्रोत की एक प्रति बनाने की आवश्यकता है। – philipp

+0

फिर अपना स्वयं का जवाब वह है जो आप –

+0

के लिए देख रहे हैं या बनाएं() और फिर करें। b.prototype = Object.prototype –

3

आप से पूछा कोई असर नहीं पड़ेगा ख है विशेष रूप से ऑब्जेक्ट.साइन के साथ एक ईएस 6 तरीके के लिए, लेकिन शायद कोई और मेरा 'सामान्य' उत्तर पसंद करेगा - आप इसे आसानी से लॉनाश के साथ कर सकते हैं, और व्यक्तिगत रूप से मुझे लगता है कि यह समाधान अधिक पठनीय है।

import * as _ from 'lodash'; 
_.set(a, 'user.groups', newGroupsValue); 

यह ऑब्जेक्ट को म्यूट करता है।

+0

शायद, लेकिन इसके लिए एक और लाइब्रेरी की आवश्यकता है ... – philipp

+1

बेशक, मुझे लगता है कि आप मेरे समाधान का उपयोग नहीं करना चाहेंगे लेकिन इसी तरह की समस्या वाले किसी और को यह उपयोगी लगेगा। –

संबंधित मुद्दे