2015-09-20 9 views
6

प्राप्त करने के लिए मैं एक अपरिवर्तनीय Map निम्नलिखितअपरिवर्तनीय सूची अद्यतन करने के लिए कैसे एक नई सूची

var mapA = Map({ 
    listA: List.of({ 
    id: 1, 
    name: 'Name A', 
    selected: false 
    }, { 
    id: 2, 
    name: 'Name B', 
    selected: false 
    }) 
}); 

मैं सूची के भीतर प्रमुख selected अपडेट करना चाहते हैं की तरह है। list.update के लिए immutable.js दस्तावेज़ों के अनुसार।

अपडेटर

बुला हालांकि की वापसी मूल्य के साथ सूचकांक पर एक अद्यतन मूल्य के साथ एक नई सूची देता है, अगर मैं इस

var listB = mapA.get('listA').update(1, function (item) { 
    item.selected = true; 
    return item; 
}); 

करते हैं और, वस्तु समानता की जांच, यह मुझे true देता है।

console.log(listB === x.get('listA')); // true 

मैं यहां क्या गलत कर रहा हूं? यह नहीं है कि कैसे अपरिवर्तनीय.जेएस काम करना चाहिए?

उत्तर

1

समस्या यह है कि आप एक अपरिवर्तनीय सूची के अंदर एक परिवर्तनशील मूल्य का उपयोग कर रहे है। सूची के लिए, ऑब्जेक्ट नहीं बदलेगा, क्योंकि oldObject === newObject अभी भी सत्य है।

> var obj = {}; 
> var list = Immutable.List.of(obj); 
> list2 = list.update(0, function(obj) { obj.foo = 42; return obj;}); 
> list2.get(0) 
Object { foo: 42 } 
> obj 
Object { foo: 42 } 
> list.get(0) === list2.get(0) 
true 

अलावा इस हल करने के लिए, यह भी नक्शा अद्यतन करने के लिए (आपको लगता है कि चाहते हैं), आप या तो

  • क्लोन अद्यतन पर वस्तु के लिए है:

    यहाँ एक सरल उदाहरण है

  • एक वस्तु के बजाय एक मानचित्र का उपयोग करें
  • शायद इस मामले में सबसे अच्छा: एक वस्तु के बजाय एक record का प्रयोग करें

उदाहरण:

var MyRecord = new Immutable.Record({id: null, name: '', selected: false}); 

var mapA = Immutable.fromJS({ 
    listA: [ 
    new MyRecord({ 
     id: 1, 
     name: 'Name A' 
    }), 
    new MyRecord({ 
     id: 2, 
     name: 'Name B' 
    }) 
    ] 
}); 

var mapB = mapA.updateIn(['listA', 1], function(record) { 
    return record.set('selected', true); 
}); 

console.log(mapB.get('listA') === mapA.get('listA')); // false 
+1

बिल्कुल, मुझे यह कोशिश करते समय एक ही समाधान मिला। धन्यवाद :) –

3

आपको मानचित्र को भी अपडेट करना होगा।

var mapB = mapA.update('listA', function(item) { 
    return item.update(1, function(item) { 
     item.selected = true; 
     return item; 
    }); 
}); 
+0

बस को जोड़ने के लिए, आप भी 'updateIn' एक मुख्यपथ – Anchor

+0

हालांकि यह काम करता है के साथ कह सकते हैं, लेकिन एक ही समय में, यह मूल वस्तु के रूप में अच्छी तरह से mutates। ऐसा क्यों! –

+0

@ एंकर ने 'अपडेटइन' की कोशिश की, यह काम नहीं करता है, 'mapA === mapB // true' –

0

यहाँ मैं क्या मिला है। समस्या List है, यह मूल रूप से सादा जावास्क्रिप्ट ऑब्जेक्ट्स का एक संग्रह है। जो म्यूटेबल हैं।

समाधान सरल है, मैंने प्रारंभिक ऑब्जेक्ट निर्माण को इसमें बदल दिया है।

var mapA = Immutable.fromJS({ 
    listA: [{ 
    id: 1, 
    name: 'Name A', 
    selected: false 
    }, { 
    id: 2, 
    name: 'Name B', 
    selected: false 
    }] 
}); 

और अब, निम्न कार्य अपेक्षित कार्य करता है।

var mapB = mapA.setIn(['listA', 1, 'selected'], true); 
संबंधित मुद्दे