如何使用 Immutable 删除 List 中的某些元素?
How can I remove some element in List with Immutable?
我将 React + redux 与 Immutable 结合使用,如何使用 Immutable 删除 List 中的某些元素?
import Immutable, { List, Map, fromJS } from 'immutable';
let initialState = fromJS({
floor: [
{
floor: '1',
rooms: [
{
room: '101'
},
{
room: '102'
},
{
room: '103'
}
]
}
]
});
export default function list(state = initialState, action) {
switch (action.type) {
//remove some room
case REMOVE_ROOM:
//how can I remove some element in List with Immutable?
default:
return state;
}
};
然后,我发送一个操作,用 dispatch(removeRoom('102'))
移除一些空间,但我怎样才能简单地用 Immutable 移除 {room: 102}
?
首先,编写一个函数findRoomPath
来查找您所在州的房间路径。
并使用deleteIn
删除该路径的值。
var roomPath = findRoomPath(state, 101);
state = state.deleteIn(roomPath);
var state = Immutable.fromJS({
floor: [
{
floor: '1',
rooms: [
{
room: '101'
}
]
},
{
floor: '2',
rooms: [
{
room: '104'
}
]
}
]
});
function findRoomPath(state, room) {
var keyPath = ['floor'];
state
.get('floor')
.find((v, k1) => {
return v
.get('rooms')
.find(function(v, k2) {
if (+v.get('room') === +room) {
keyPath.push(k1, 'rooms', k2);
return true;
}
});
});
return keyPath.length > 1 ?
keyPath :
null;
}
function deleteRoom(state, room) {
var roomPath = findRoomPath(state, room);
return (roomPath) ?
state.deleteIn(roomPath) :
state;
}
console.log(deleteRoom(state, 101).toJS());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
我必须说,我对 Immutable 不是很熟悉,但这有点干净。我强烈建议您重新考虑您所在州的结构!以后你会避免很多痛苦!
export default function list(state = initialState, {type, payload}) {
switch (type) {
//remove some room
case REMOVE_ROOM:
return removeRoom(state, payload);
default:
return state;
}
};
const removeRoom (state, roomToRemove) => {
const floor = state.get('floor').map(floor => {
const rooms = floor.get('rooms').filter(room => room.get('room') !== roomToRemove)
return floor.merge({rooms});
})
return state.merge({floor});
};
我将 React + redux 与 Immutable 结合使用,如何使用 Immutable 删除 List 中的某些元素?
import Immutable, { List, Map, fromJS } from 'immutable';
let initialState = fromJS({
floor: [
{
floor: '1',
rooms: [
{
room: '101'
},
{
room: '102'
},
{
room: '103'
}
]
}
]
});
export default function list(state = initialState, action) {
switch (action.type) {
//remove some room
case REMOVE_ROOM:
//how can I remove some element in List with Immutable?
default:
return state;
}
};
然后,我发送一个操作,用 dispatch(removeRoom('102'))
移除一些空间,但我怎样才能简单地用 Immutable 移除 {room: 102}
?
首先,编写一个函数findRoomPath
来查找您所在州的房间路径。
并使用deleteIn
删除该路径的值。
var roomPath = findRoomPath(state, 101);
state = state.deleteIn(roomPath);
var state = Immutable.fromJS({
floor: [
{
floor: '1',
rooms: [
{
room: '101'
}
]
},
{
floor: '2',
rooms: [
{
room: '104'
}
]
}
]
});
function findRoomPath(state, room) {
var keyPath = ['floor'];
state
.get('floor')
.find((v, k1) => {
return v
.get('rooms')
.find(function(v, k2) {
if (+v.get('room') === +room) {
keyPath.push(k1, 'rooms', k2);
return true;
}
});
});
return keyPath.length > 1 ?
keyPath :
null;
}
function deleteRoom(state, room) {
var roomPath = findRoomPath(state, room);
return (roomPath) ?
state.deleteIn(roomPath) :
state;
}
console.log(deleteRoom(state, 101).toJS());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>
我必须说,我对 Immutable 不是很熟悉,但这有点干净。我强烈建议您重新考虑您所在州的结构!以后你会避免很多痛苦!
export default function list(state = initialState, {type, payload}) {
switch (type) {
//remove some room
case REMOVE_ROOM:
return removeRoom(state, payload);
default:
return state;
}
};
const removeRoom (state, roomToRemove) => {
const floor = state.get('floor').map(floor => {
const rooms = floor.get('rooms').filter(room => room.get('room') !== roomToRemove)
return floor.merge({rooms});
})
return state.merge({floor});
};