2012-02-26 28 views
10

मैं निम्नलिखित की तरह एक संरचना है:जावास्क्रिप्ट ऑब्जेक्ट प्रॉपर्टी अपडेट कर रहा है?

skillet.person = { 
    name: { 
    first: '', 
    last: '' 
    }, 
    age: { 
    current: '' 
    }, 
    birthday: { 
    day: '', 
    month: '', 
    year: '' 
    } 
} 

मैं सोच रहा था कि कैसे मैं इन मूल्यों को अपडेट होगा? यानी मैं निम्नलिखित सही था

skillet.person.name.push({ first: 'blah', last: 'ha'}); 

लेकिन यह गलत है? मैं इसे कैसे ठीक करूं ?

+4

MDN एक महान जावास्क्रिप्ट ट्यूटोरियल, प्रतिक्रिया के लिए विशेष रूप से https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects –

उत्तर

15

यदि आप किसी ऑब्जेक्ट को किसी अन्य रूप में मिश्रित करना चाहते हैं, तो आप jQuery के गहरे विस्तार फ़ंक्शन का उपयोग कर सकते हैं। "दीप" का अर्थ है कि यह नई वस्तु के साथ name को ओवरराइट नहीं करता है, बल्कि इस तरह के ऑब्जेक्ट के अंदर गुणों को ओवरराइट करता है।

$.extend(true, skillet.person, { 
    name: { 
    first: 'updated' 
    }, 
    birthday: { 
    day: 'updated', 
    year: 'updated' 
    } 
}); 

अब, skillet.person जबकि अन्य संपत्तियों अछूता कर रहे हैं, उचित गुण अद्यतन है।

+0

हाँ! बहुत धन्यवाद :) यही वह है जिसे मैं ढूंढ रहा था – Andy

13
skillet.person.name.first = "blah" 
skillet.person.name.last = "ha" 

या

skillet.person.name = {first : "blah", last : "ha"} 
+0

धन्यवाद है। यदि प्रत्येक मूल्य उपलब्ध नहीं है तो मैं संपत्ति को प्रतिस्थापित नहीं करना चाहता हूं, तो प्रत्येक मूल्य को सूचीबद्ध करने के बजाय अपडेट करने का एक तेज़ तरीका है? – Andy

+1

@ एंडी: आप एक 'विस्तार' फ़ंक्शन ढूंढ रहे हैं। [कार्यान्वयन के लिए Underscore.js देखें।] (Http://documentcloud.github.com/underscore/#extend) – pimvdb

+0

@pimvdb - हाँ इस समय मेरे पास गुणों का ढेर है लेकिन सभी में मूल्य नहीं हैं। मैं ऑब्जेक्ट को केवल आंशिक उचितताओं के साथ बदल रहा था और यह एक समस्या पैदा कर रहा था - इसका मतलब यह है कि मुझे प्रत्येक मूल्य की सूची श्रीमान ने की है या बदलने के बिना कोई तेज तरीका है? – Andy

4

pushArray रों की एक विधि है कि एक सरणी के लिए एक नया आइटम कहते हैं है।

आप तो मूल्य बदलना चाहते हैं: आप वस्तु में एक से अधिक (पूर्ण) नाम संग्रहीत करना चाहते हैं

skillet.person.name = { … }; 

, तो आप एक के बजाय ऑब्जेक्ट की श्रृंखला आयोजित करने की संपत्ति की आवश्यकता होगी एकल वस्तु

+0

यदि मैं प्रतिस्थापित नहीं करना चाहता हूं तो प्रत्येक मूल्य को सूचीबद्ध करने के बजाय अपडेट करने का एक तेज़ तरीका है? – Andy

+2

@ एंडी: आप ऑब्जेक्ट गुणों पर पुन: प्रयास कर सकते हैं। 'के लिए (newValues ​​में var prop) {oldValues ​​[prop] = newValues ​​[prop];}' (एक गिस्ट में)। एमडीएन के पास 'के लिए ...' के बारे में एक अच्छा पृष्ठ भी है। इस पर एक नज़र डालो। –

1

ECMAScript 2015 के साथ हाल के ब्राउज़र में, आप कर सकते हैं:

Object.assign(skillet.person.name, { first: 'blah', last: 'ha'}); 

जो सही वस्तु में सूचीबद्ध नहीं किसी भी मौजूदा विशेषता भी सुरक्षित रहेंगे।

संदर्भ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

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

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