2016-04-15 10 views
18

में ऑब्जेक्ट को कैसे अपडेट करें मेरे पास जेएस ऑब्जेक्ट (सरणी नहीं) में users की अनुक्रमित सूची है। यह प्रतिक्रिया राज्य का हिस्सा है।प्रतिक्रिया स्थिति

  1. एक नया उपयोगकर्ता जोड़ने:

    { 
        1: { id: 1, name: "John" } 
        2: { id: 2, name: "Jim" } 
        3: { id: 3, name: "James" } 
    } 
    

    लिए सबसे अच्छा अभ्यास क्या है {आईडी: 4, नाम: "जेन"} आईडी वाले (4) कुंजी के रूप में

  2. आईडी 2 के साथ एक उपयोगकर्ता को दूर
  3. परिवर्तन "पीटर"
किसी भी अपरिवर्तनीय सहायकों के बिना

करने के लिए उपयोगकर्ता # 2 का नाम है। मैं कॉफ़ीस्क्रिप्ट और अंडरस्कोर का उपयोग कर रहा हूं (इसलिए _.extend ठीक है ...)।

धन्यवाद।

उत्तर

9

यह मैं क्या कर सकता है

  • ऐड: var newUsers = _.extend({}, users, { 4: { id: 4, ... } })
  • निकालें: var newUsers = _.extend({}, users) तो delete newUsers['2']
  • परिवर्तन: var newUsers = _.extend({}, users) तो newUsers['2'].name = 'Peter'
+1

यह सही जवाब है के लिए Map उपयोग कर सकते हैं। एक नई वस्तु बनाने के लिए विस्तार का उपयोग करें, फिर mutate। –

+1

मैं सहमत हूं, लेकिन "परिवर्तन" मामले में हमें संशोधित उपयोगकर्ता की ऑब्जेक्ट को कॉपी करना होगा, जैसे: var newUser = _.extend ({}, उपयोगकर्ता ['2'], {name: 'Peter'}); var newUsers = _.extend ({}, उपयोगकर्ता, {2: newUser}); –

+0

@ pierrepinard_2 अच्छा बिंदु, जो घटक को उस घटक के लिए बेहतर बनाना चाहिए जो व्यक्तिगत उपयोगकर्ताओं को दिखाता है। – kavun

5

आप फ्लक्स उपयोग नहीं कर रहे हैं, तो आप राज्य ऑब्जेक्ट को अद्यतन करने के लिए this.setState() का उपयोग करें।

delUser(id) { 
    const users = this.state.users; 
    delete users[id]; 
    this.setState(users); 
} 

addChangeUser(id, name) { 
    const users = this.state.users; 
    users[id] = {id: id, name: name}; 
    this.setState(users); 
} 

तो फिर तुम इस के साथ अपने परीक्षण मामलों पर अमल कर सकते हैं:

addChangeUser(4, 'Jane); 
addChangeUser(2, 'Peter'); 
delUser(2); 
+0

आपकी 'addUser' विधियां ओपी द्वारा निर्दिष्ट कुंजी' 4' के साथ ऑब्जेक्ट जोड़ने के बजाय ऑब्जेक्ट को कुंजी 'आईडी' के साथ अपडेट करेंगी। 'changeName' में एक ही समस्या है। –

+0

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

+2

यदि आप ES2015 (ES6) का उपयोग कर रहे हैं तो आप इसे 'कर सकते हैं।सेटस्टेट ({[आईडी]: {...}); '। –

0

setState भी एक समारोह है, तो आप अधिक सहज ज्ञान युक्त

function add(user) { 
    this.setState(users => { 
    users[ user.id ] = user 
    return users 
    } 
} 

function remove(id) { 
    this.setState(users => { 
    delete users[ id ] 
    return users 
} 

इन कार्यों है कि आपके state वस्तु मान मिल सकती है जो स्वीकार करता है आपकी users ऑब्जेक्ट है, यदि यह वास्तव मेंहैतो आपको users बाहर लेना होगा, setState पर फ़ंक्शन पास करने से हमेशा वास्तविक state ऑब्जेक्ट को गुजरने के लिए कहा जाएगा।

इस उदाहरण में add का उपयोग आपके वास्तविक उपयोग-मामले के आधार पर संशोधित करने के लिए भी किया जा सकता है, आप अलग-अलग सहायकों को बनाना चाहते हैं। _.extend से

2

अलावा आप भंडारण user

let user = new Map(); 
user.set(4, { id: 4, name: "Jane" }); //adds with id (4) as key 
user.myMap.set(2, { id: 2, name: "Peter" }); // set user #2 to "Peter" 
user.delete(3); //deletes user with id 3 
संबंधित मुद्दे