ImmutableJS - обновить значение в списке

У меня есть карта, подобная этой (в ImmutableJS):

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

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

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

Я тоже пробовал прямо это, и он не работал:

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

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

Ответ 1

То, что вы делаете, является правильным (см. этот 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. Он не мутирует существующие данные, а создает новый из существующего.

Ответ 2

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

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

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

Ответ 3

activePane - это индекс объекта в массиве (список), который мне пришлось изменить

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);