2015-08-01 21 views
10

Tôi có một bản đồ như thế này (trong ImmutableJS):ImmutableJS - cập nhật giá trị trong một danh sách

{arrayOfValues: [ 
    {one: {inside: 'first in array'}}, 
    {one: {inside: 'second in array'}} 
]} 

Và tôi muốn cập nhật giá trị "bên trong" ở mục thứ hai trong "arrayOfValues" mảng. Tôi làm nó như thế nào? Đây là những gì tôi có bây giờ và nó nói "Lỗi chưa gặp: keyPath không hợp lệ"

theMap.update('arrayOfValues',(list)=>{ 
    return list.setIn([1,'one','inside'],'updated value'); 
}) 

Tôi cũng đã cố gắng trực tiếp này và nó đã không làm việc:

theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value'); 

Sau nhiều giờ tìm kiếm các giải pháp , Tôi đánh giá cao sự giúp đỡ nào. Cảm ơn bạn.

+0

Ví dụ của bạn làm việc cho tôi mà không gặp lỗi. – Artem

+0

bạn không thể cập nhật cấu trúc không thay đổi được. – dandavis

Trả lời

2

dụ setIn của bạn hoạt động như bạn sẽ thấy trong plunkr này: http://plnkr.co/edit/1uXTWtKlykeuU6vB3xVO?p=preview

Có lẽ bạn đang giả định giá trị của theMap sẽ được thay đổi như là kết quả của setIn?

Khi những cấu trúc là không thay đổi, bạn phải nắm bắt được giá trị sửa đổi trong một biến mới như var theMap2 = theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value');

12

gì bạn đang làm là đúng (xem này JSBin).

const orig = Immutable.fromJS({ 
    arrayOfValues: [ 
    { one: { inside: 'first in array' } }, 
    { one: { inside: 'second in array' } }, 
    ] 
}); 

const updated = orig.setIn(['arrayOfValues', 1, 'one', 'inside'], 'updated value'); 

console.log(updated.toJS()); 

// { 
// arrayOfValues: [ 
//  { one: { inside: 'first in array' } }, 
//  { one: { inside: 'second in array' } }, 
// ] 
// } 

Khi bạn gọi orig.setIn(), nó không trực tiếp sửa đổi orig. Đó là toàn bộ mục đích của thư viện Immutable này. Nó không làm thay đổi dữ liệu hiện có mà tạo ra dữ liệu mới từ dữ liệu hiện có.

+0

vì vậy "Nó không làm thay đổi dữ liệu hiện có nhưng tạo ra một dữ liệu mới từ dữ liệu hiện có" - liệu nó có hợp lý theo đó chúng ta sẽ trả về đối tượng mới như trạng thái không? bit mờ trên đó cho tôi – steveinatorx

+1

@steveinatorx: Đúng vậy. Bạn phải trả về đối tượng mới ('updated') làm trạng thái. 'orig' vẫn đề cập đến dữ liệu cũ (tức là' cập nhật! == orig') –

0

activePane is the index of Object in Array(List) that I had to modify

case CHANGE_SERVICE: 
    var obj = { 
    title: '1212121 Tab', 
    service: '', 
    tagName: '', 
    preDefinedApi: '', 
    methodType: '', 
    url: '', 
    urlParams: [{ 
     label: '', 
     name: '', 
     value: '', 
    }], 
    headers: [{ 
     label: '', 
     name: '', 
     value: '', 
    }], 
    }; 
    var activePane = state.get('activePane'); 
    var panes = state.setIn(['panes', activePane, 'service'], action.val); 

    return state.setIn(['panes', activePane, 'service'], action.val); 
Các vấn đề liên quan