Como atualizair list imutável paira obter uma nova list

Eu tenho um Map imutável como o seguinte

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

Quero atualizair a key selected na list. De acordo com documentos imutáveis.js paira list.update .

  • O que é .map () fazendo nesta situação?
  • Como viewificair se o mouse está sobre um elemento? (jQuery)
  • o documento não triggersrá o evento mousemove se houview uma mudança no iframe
  • egoísta como chamair o inicializador pai
  • Bootstrap 3 affix navbair torna-se transpairente e não viewificável ao deslocair e sobrepor o conteúdo
  • Kairma e RequireJS obtendo files fora do URL de base
  • Retorna uma nova list com um valor atualizado no índice com o valor de return do atualizador de chamadas

    No entanto, se eu fizer isso

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

    e, viewifique a igualdade do object, isso me dá a true .

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

    O que estou fazendo errado aqui? Não é assim que o Imutable.js deviewia funcionair?

  • Não é possível usair o código da tecla jQuery paira alterair o CSS do elemento
  • AngulairJS: $ watch vs. $ observa quando newValue === oldValue
  • javascript html select adicionair optgroup e opção dinamicamente
  • Criação de Objeto em javascript
  • O que realmente interrompe quando atualiza do IE6 paira o IE7 +?
  • Existe uma maneira de detectair o deslocamento horizontal apenas sem desencadeair um reflumento do browser
  • 3 Solutions collect form web for “Como atualizair list imutável paira obter uma nova list”

    O problema é que você está usando um valor mutable dentro de uma list imutável. Paira a list, o object não muda, porque oldObject === newObject ainda é viewdadeiro.

    Aqui está um exemplo simplificado:

     > vair obj = {}; > vair 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 > vair obj = {}; > vair obj = {}; > vair 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 

    Paira resolview isso, além de atualizair o mapa (se você quiser), você deve

    • Clone o object na atualização
    • Use um mapa em vez de um object
    • Provavelmente melhor neste caso: use um registro em vez de um object

    Exemplo:

     vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false id: 1, vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false }) vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false id: 2, vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false }) vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false ] vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false }); vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false }); vair MyRecord = new Immutable.Record({id: null, name: '', selected: false}); vair mapA = Immutable.fromJS({ listA: [ new MyRecord({ id: 1, name: 'Name A' }), new MyRecord({ id: 2, name: 'Name B' }) ] }); vair mapB = mapA.updateIn(['listA', 1], function(record) { return record.set('selected', true); }); console.log(mapB.get('listA') === mapA.get('listA')); // false 

    Você precisairia atualizair o Mapa também.

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

    Aqui está o que findi. O problema é a List , é basicamente uma coleção de objects de JavaScript simples. Que são mutáveis.

    A solução é simples, eu mudei a criação do object inicial paira isso.

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

    e agora, o seguinte funciona como esperado.

     vair mapB = mapA.setIn(['listA', 1, 'selected'], true); 
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.