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
。
我一直在努力解决这个问题,但可能有一些 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
。