首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将状态与对象数组合并,忽略React Native Redux中的重复项

将状态与对象数组合并,忽略React Native Redux中的重复项
EN

Stack Overflow用户
提问于 2017-01-09 03:47:29
回答 1查看 4.1K关注 0票数 4

我的初始状态是这样的:

代码语言:javascript
运行
复制
export const INITIAL_STATE = Immutable({
  payload: []
})

当我分派请求操作时,它返回一个对象数组,如下所示:

代码语言:javascript
运行
复制
[
  {id: 1, name: 'userA'},
  {id: 2, name: 'userB'},
  {id: 3, name: 'userC'}
]

因此,当我尝试刷新状态时,我会将现有有效负载与从服务器获得的新有效负载合并:

代码语言:javascript
运行
复制
export const success = (state, { payload }) => {
  const newPayload = state.payload.concat(payload)

  return state.merge({ payload: newPayload })
}

这使得我的新状态最终是这样的:

代码语言:javascript
运行
复制
[
  {id: 1, name: 'userA'},
  {id: 2, name: 'userB'},
  {id: 3, name: 'userC'},
  {id: 4, name: 'userD'},
  {id: 5, name: 'userE'},
  {id: 6, name: 'userF'}
]

所以,这部分工作了,但是,如果我再次调用我的请求操作,状态将被重复的数据填充,如下所示:

代码语言:javascript
运行
复制
[
  {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,那么我的新状态将如下所示:

代码语言:javascript
运行
复制
[
  {id: 1, name: 'userA'},
  {id: 2, name: 'newUserB'},
  {id: 3, name: 'userC'},
  {id: 4, name: 'userD'},
  {id: 5, name: 'userE'},
  {id: 6, name: 'userF'}
]

而不是这样:

代码语言:javascript
运行
复制
[
  {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 })和同样的方法。

有人知道如何做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-09 04:47:17

首先合并两个数组,然后只过滤唯一项。

代码语言:javascript
运行
复制
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 })
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41537087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档