Immutable.js deleteIn无法正常工作 [英] Immutable.js deleteIn not working

查看:75
本文介绍了Immutable.js deleteIn无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试解决此问题,但是可能有些Immutable.js没有被我发现.我希望有人能帮助我理解.

I have been trying to solve this problem, but there is probably something of Immutable.js that I don't catch. I hope somebody can help me to understand.

我有这样的测试:

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

...女巫测试了此功能:

...witch tests this funtion:

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

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

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

但是它不起作用.我已经尝试了所有方法....更改行使其起作用,但是我没有删除项目编号3.

but it doesn't work. I have tryed everything.... changing the line to make it work, but I don't get the item number 3 deleted.

怎么了?有人帮我吗?

推荐答案

这应该有效:

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应该成为密钥路径的一部分.
  • removingNumber,但是由于您是通过JS对象创建的Map,因此其键将是String的键(在
  • deleteIn takes a single keyPath argument, which in your case is [ 'members' ]. The second argument (removing) is ignored, so the result is that the entire members map is deleted; instead, removing should become part of the key path.
  • removing is a Number, but because you're creating a Map from a JS object, its keys will be String's (this is mentioned in the documentation as well):

请记住,当使用JS对象构造不可变地图时,JavaScript对象属性始终是字符串

因此,在将removing传递到deleteIn时,需要将其转换为String.

So you need to convert removing to a String when passing it to deleteIn.

这篇关于Immutable.js deleteIn无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆