Immutable.js deleteIn 无效

Immutable.js deleteIn not working

我一直在努力解决这个问题,但可能有一些 Immutable.js 我没有理解。我希望有人能帮助我理解。

我有这样的测试:

import {List, Map} from 'immutable';
import {expect} from 'chai';

import {setInitial,
        addAtListOfMembers,
        removeAtListOfMembers
        } from '../src/core';


      describe('removeAtListOfMembers', () => {

        it('remove a member to the list of members', () => {
          const state = Map({
            removing: 3,
            infos : Map(),
            members: Map({
                1:Map({
                    userName:'René',
                    date:'12/02/2016'
                }),
                2:Map({
                    userName:'Jean',
                    date:'10/03/2016'
                }),
                3:Map({
                    userName:'Elene',
                    date:'05/01/2016'
                })
              })
          });
          const nextState = removeAtListOfMembers(state);

          expect(nextState).to.equal(Map({
            infos : Map(),
            members: Map({
                1:Map({
                    userName:'René',
                    date:'12/02/2016'
                }),
                2:Map({
                    userName:'Jean',
                    date:'10/03/2016'
                })
              })
          }));
        });
      });
});

... 测试此功能:

export function removeAtListOfMembers(state) {
  const members = state.get('members');

  const removing = state.get('removing');

  return state
        .deleteIn(['members'], removing)
        .remove('removing');
}

但它不起作用。我已经尝试了一切....更改行以使其工作,但我没有删除项目编号 3。

怎么了?有人可以帮助我吗?

这应该有效:

export function removeAtListOfMembers(state) {
  const members = state.get('members');

  const removing = state.get('removing');

  return state
        .deleteIn(['members', String(removing) ])
        .remove('removing');
}

您的代码有两个问题:

  • deleteIn 接受一个 keyPath 参数,在你的例子中是 [ 'members' ]。第二个参数 (removing) 被忽略,所以结果是整个 members 映射被删除;相反,removing 应该成为关键路径的一部分。
  • removing 是一个 Number,但是因为你是从一个 JS 对象创建一个 Map,它的键将是 String 的(这被提到在 the documentation 中也是如此):

    Keep in mind, when using JS objects to construct Immutable Maps, that JavaScript Object properties are always strings

所以在传递给deleteIn时需要将removing转换为String