我的初始状态是这样的:
export const INITIAL_STATE = Immutable({
payload: []
})当我分派请求操作时,它返回一个对象数组,如下所示:
[
{id: 1, name: 'userA'},
{id: 2, name: 'userB'},
{id: 3, name: 'userC'}
]因此,当我尝试刷新状态时,我会将现有有效负载与从服务器获得的新有效负载合并:
export const success = (state, { payload }) => {
const newPayload = state.payload.concat(payload)
return state.merge({ payload: newPayload })
}这使得我的新状态最终是这样的:
[
{id: 1, name: 'userA'},
{id: 2, name: 'userB'},
{id: 3, name: 'userC'},
{id: 4, name: 'userD'},
{id: 5, name: 'userE'},
{id: 6, name: 'userF'}
]所以,这部分工作了,但是,如果我再次调用我的请求操作,状态将被重复的数据填充,如下所示:
[
{id: 1, name: 'userA'},
{id: 2, name: 'userB'},
{id: 3, name: 'userC'},
{id: 4, name: 'userD'},
{id: 5, name: 'userE'},
{id: 6, name: 'userF'},
{id: 1, name: 'userA'}, // <== duplicated data
{id: 2, name: 'userB'}, // <== duplicated data
{id: 3, name: 'userC'} // <== duplicated data
]我需要的是,如果我调用请求操作,并且从服务器返回相同的数据-在本例中为id 1、2和3-那么state.merge只需保持有效负载不变,或者使用新值更新它们(如果是这样的话),所以如果id为2的用户将其在服务器中的名称更新为newUserB,那么我的新状态将如下所示:
[
{id: 1, name: 'userA'},
{id: 2, name: 'newUserB'},
{id: 3, name: 'userC'},
{id: 4, name: 'userD'},
{id: 5, name: 'userE'},
{id: 6, name: 'userF'}
]而不是这样:
[
{id: 1, name: 'userA'},
{id: 2, name: 'userB'},
{id: 3, name: 'userC'},
{id: 4, name: 'userD'},
{id: 5, name: 'userE'},
{id: 6, name: 'userF'},
{id: 1, name: 'userA'},
{id: 2, name: 'newUserB'},
{id: 3, name: 'userC'}
]我试过使用state.merge({ payload: newPayload }, {deep: true}),但它的工作方式不是我期望的那样,我也尝试了state.merge({ payload })和同样的方法。
有人知道如何做到这一点吗?
发布于 2017-01-09 04:47:17
首先合并两个数组,然后只过滤唯一项。
export const success = (state, { payload }) => {
const newArr = state.payload.concat(payload)
const idPositions = newArr.map(el => el.id)
const newPayload = newArr.filter((item, pos, arr) => {
return idPositions.indexOf(item.id) == pos;
})
return state.merge({ payload: newPayload })
}https://stackoverflow.com/questions/41537087
复制相似问题