以下是我的数据结构
[
{
"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来执行此操作
以下是我的代码
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中应该有一种更简单的方法。任何建议都会有所帮助,谢谢。
答案 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)
然后更新帖子和评论变得更加容易