Elm 如何获取属性值出现次数最多的项?

Elm 如何获取属性值出现次数最多的项?,elm,Elm,我有一个记录列表,它偶尔可以与列表中的其他记录具有相同的属性值 我想确定属性值的最顶层引用 此类记录可以是以下内容: type alias Topic = { name : String } topicGroups = |> someTopics |> List.map .name |> groupWhile (\name1 name2 -> name1 == name2) orderedTopics =

我有一个记录列表,它偶尔可以与列表中的其他记录具有相同的属性值

我想确定属性值的最顶层引用

此类记录可以是以下内容:

type alias Topic =
    { name : String }
topicGroups =
        |> someTopics
        |> List.map .name
        |> groupWhile (\name1 name2 -> name1 == name2)

orderedTopics =
    topicGroups
        |> List.sortBy List.length
        |> List.reverse
        |> List.concat
        |> uniqueBy toString
        |> List.map (\n -> { name = n })
我相信为了实现这一点,我需要使用

因此,我尝试了以下方法:

type alias Topic =
    { name : String }
topicGroups =
        |> someTopics
        |> List.map .name
        |> groupWhile (\name1 name2 -> name1 == name2)

orderedTopics =
    topicGroups
        |> List.sortBy List.length
        |> List.reverse
        |> List.concat
        |> uniqueBy toString
        |> List.map (\n -> { name = n })
然而,上面的代码不适合我。它似乎按降序返回所有主题


可以找到源代码。

当我在Repl中尝试它时,它似乎可以工作

module Test exposing (..)

import List as L
import Dict exposing (Dict)


type alias Topic =
    { name : String }


mostCommon : List Topic -> Maybe String
mostCommon lst =
    let
        incrementer : Maybe Int -> Maybe Int
        incrementer mbIdx =
            mbIdx |> Maybe.map ((+) 1) |> Maybe.withDefault 1 |> Just

        go : Topic -> Dict String Int -> Dict String Int
        go t acc =
            Dict.update t.name incrementer acc
    in
        L.foldl go Dict.empty lst
            |> Dict.toList
            |> List.sortBy (Tuple.second >> (*) -1)
            |> L.head
            |> Maybe.map Tuple.first


myMax =
    mostCommon [ Topic "a", Topic "b", Topic "a", Topic "b", Topic "b" ]

我不明白你所说的最重要的事件是什么意思。如果获取主题列表并按name属性对其进行分组,则会得到一个嵌套列表,其中内部列表中的主题都具有相同的name属性值。如果将长度函数映射到外部列表,则会得到一个数字列表,每个数字表示出现的次数,但会丢失主题详细信息。也许您想要List{count:Int,name:String,topics:List Topic}作为输出;具有给定名称的主题数量,以及相应的主题本身。@EmmanuelRosa代码使用的是sortBy,而不是map。我的答案对youHi Simon有用吗?我收到了一个较短的解决方案,并使用了它。我没有测试你的,但无论如何我会把它标记为答案。