ImmutableJS如何简化过滤器和更新逻辑

时间:2016-01-20 01:33:32

标签: redux immutable.js

以下是我的数据结构

[
  {
    "id": 1,
    "title": "Welcome to my playground",
    "description": "This is so fun to play with, you will like it <3",
    "comments": [
      {
        "id": 1140406,
        "comment": "this is an example comment",
        "postId": 1
      }
    ]
  },
  ...
]

我正在尝试使用不可变的j来执行此操作

  1. 获取所有帖子
  2. 搜索我要添加评论的帖子
  3. 找到帖子时添加评论
  4. 以下是我的代码

    posts = posts.map((post) => {
    
                if(post.get('id') == payload.post_id) {
    
                    return post.update('comments', (comments) => {    
                        return comments.push(Map({
                            id: payload.id,
                            comment: payload.comment
                        }));
                    });
                }
    
                return post;
            });
    

    但我认为这种模式很常见,并且在immutableJS中应该有一种更简单的方法。任何建议都会有所帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

首先,值得一提的是您的数据结构是不可变列表和地图..而不是JS数组和对象。

好的,无需更改数据结构即可:

posts.map(post => post.get('id') === payload.post_id ?
  post.update('comments', comments.push(payload) :
  post)

如果您要更改自己的数据结构,而不是拥有帖子列表,那么您可以使用其ID作为关键字发布地图:

post.updateIn([payload.post_id, 'comments'], comments => comments.push(payload))

顺便说一句,你可以在这里使用push或concat,两者的功能都相同。

此外,如果评论可能未定义,您可以提供&#34; noSetValue&#34;作为列表(https://facebook.github.io/immutable-js/docs/#/List/updateIn):

posts.map(post => post.get('id') === payload.post_id ?
  post.update('comments', Immutable.List([]), comments.push(payload) :
  post)

post.updateIn([payload.post_id, 'comments'], Immutable.List([]), comments => comments.push(payload))

答案 1 :(得分:0)

对于其他人有相同的问题:应该考虑数据标准化(搜索"entities": { "posts": { "1": { "id": 1, "title": "Welcome to my playground", "description": "This is so fun to play with, you will like it <3", "comments": [1140406, 1140407, 1140408] }, "42" : {...} } "comments": { "1140406": { "id": 1140406, "comment": "this is an example comment", "postId": 1 }, "1140407": {...} } } )。然后,您可以将数据规范化为:

print(meter)
print(second)
print(a)

然后更新帖子和评论变得更加容易