List 使用elm中的新数据更新嵌套记录

List 使用elm中的新数据更新嵌套记录,list,immutability,record,elm,List,Immutability,Record,Elm,我已经成功地按顺序解码了两段JSON。我想使用新的html\u片段并更新我现有的html\u片段。一般来说,这很简单,但我的数据结构给我带来了困难: type PostDataContainer = PostDataContainer PostData type alias PostData = { title : String , comments : List Comment } type alias Comment = { comment_i

我已经成功地按顺序解码了两段JSON。我想使用新的
html\u片段
并更新我现有的
html\u片段
。一般来说,这很简单,但我的数据结构给我带来了困难:

type PostDataContainer
    = PostDataContainer PostData


type alias PostData =
    { title : String
    , comments : List Comment
    }


type alias Comment =
    { comment_id : Int
    , html_fragment : String
    }


type alias CommentHtml =
    { id : Int
    , html_fragment : String
    }
我刚刚收到
CommentHtml
,希望更新
Comment
中现有的
html\u片段。这就是我到目前为止所做的:

    MergeCommentHtml commentHtmlData ->
        case commentHtmlData of
            Err err ->
                Debug.log ("Error decoding CommentHtmlData" ++ toString err)
                    ( mdl, Cmd.none )

            Ok commentHtml ->
                case mdl.maybePostDataContainer of
                    Just (PostDataContainer postData) ->
                        let
                            updatedCommentData = -- I dont know how to calculate this?
                        in
                        ( { mdl | postData = { postData | comments = updatedCommentData } }, Cmd.none )
请注意,
commentHtml
这里是一个
列表commentHtml
。关于如何用
commentHtml
中的新值更新我的旧
comment.html_片段
有什么想法吗

选项1: 只要按原样解码数据就行了。当需要显示它时,通过您编写的函数适当地安排它,比如
rawJsonDataToNicerData

选项2:
假设您实现了以下功能:

——给定新注释和一些PostData,返回PostData的新版本
updateData:CommentHtml->PostData->PostData
--现在,假设我们可以用commentHtmlDeocder解码CommentHtml
--我们可以做到以下几点
DataUpdateDecoder:解码器(PostData->PostData)
数据更新解码器
CommentHtmlCoder |>Decoder.and然后(\commentHtml->updateData commentHtml)
现在,无论我们在哪里解码
CommentHtmlDecoder
,我们都可以解码
DataUpdateDecoder
,并使用一组数据更新数据

下面是一个使用上述思想的关系数据解码器的示例:


鉴于
commentHtmlData
是一个根据注释列出的
列表,我认为最简单的方法是将其转换为
Dict
,由
id
键入,然后映射现有注释,在Dict中查找
注释id
。如果它存在,则替换
html\u片段
,如果没有,则返回未修改的原始文件:

let
    commentHtmlDict =
        commentHtmlData
            |> List.map (\c -> (c.id, c))
            |> Dict.fromList

    updatedCommentData =
        postData.comments
            |> List.map (\comment ->
                case Dict.get comment.comment_id commentHtmlDict of
                    Just commentHtml ->
                        { comment | html_fragment = commentHtml.html_fragment }

                    Nothing ->
                        comment
            )

我已经竖起大拇指,因为
是一个尝试的好主意。但这并不能完全回答我的问题。。。我在解码它时没有遇到问题,当我尝试基于id合并两个数据集时,问题就出现了。我的答案显示了如何基于任何其他任意json更新任何数据结构。我感兴趣的是这还不够。也许你应该分享更多的代码或把它放在一个椭圆中。我感兴趣的是
updateData
看起来像什么的细节。我不清楚你到底想完成什么,到底是什么部分给你带来麻烦。是的,这很接近!但是,
commentHtmlData
是一个列表。我收到一个编译错误
commentHtmlData的类型是:List CommentHtml
是的,这是一条重要信息:)我用一个稍微修改的建议更新了答案。这是我正在寻找的解决方案,谢谢。我以前从未使用过
Dict
。。。你有没有想过一个没有它的解决方案?你可以使用
List.Extra.find
from,或者直接使用。但是一个
Dict
会表现得更好(O(logn)比O(n)查找),这可能很重要,因为你要在它里面搜索每一条评论。