2015-08-01 2 views
10

У меня есть карта, как это (в ImmutableJS):ImmutableJS - значение обновления в списке

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

И я хочу, чтобы обновить значение «внутри» во втором элементе массива «arrayOfValues». Как мне это сделать? Это то, что у меня есть сейчас, и он говорит: «Uncaught Ошибка: недопустимый ключевой ресурс»

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

Я также попытался прямо это и не получилось:

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

После нескольких часов ищут решения , Я ценю любую помощь. Спасибо.

+0

Ваш пример работает для меня без ошибок. – Artem

+0

вы не можете обновлять неизменяемые структуры. – dandavis

ответ

2

Ваш setIn пример работает, как вы должны видеть в этом plunkr: http://plnkr.co/edit/1uXTWtKlykeuU6vB3xVO?p=preview

Возможно, вы предполагая, что значение theMap будет изменено в результате setIn?

Поскольку эти структуры неизменны, вы должны захватить измененное значение в новой переменной, как var theMap2 = theMap.setIn(['arrayOfValues',1,'one','inside'],'updated value');

12

Что вы делаете правильно (см это 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' } }, 
// ] 
// } 

При вызове orig.setIn(), она не изменяет orig непосредственно. Вот и вся цель этой библиотеки Immutable. Он не мутирует существующие данные, а создает новый из существующего.

+0

, поэтому «он не мутирует существующие данные, а создает новый из существующего» - логично ли это было бы, что мы должны вернуть новый объект в качестве состояния? бит нечеткий на том, что для меня – steveinatorx

+1

@steveinatorx: Это правильно. Вы должны вернуть новый объект ('updated') в качестве состояния. 'orig' по-прежнему относится к старым данным (то есть' updated! == 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); 
Смежные вопросы