字典init(grouping:by :),分为2级-简化代码

Dictionary(init(grouping:by:))在我需要按某些属性对数组元素进行分组时工作正常。

我得到的是:

{
    key1: [
        value1,value2,value3
        ],key2: [
        value4,value5,value6
        ]
}

但是,我需要进一步转换数组,将每个分区分组为更小的组,以使生成的数据结构具有两层:

{
    key1: {
        anotherKey1: [
            value1,],anotherKey2: [
            value2,value3]
    },key1: {
        anotherKey3: [
            value4,anotherKey4: [
            value5,value6]
    },}

获得此结果的最简单方法是什么?目前,我必须遍历第一个字典初始化程序调用的结果:

        let grouped = Dictionary(grouping: Array(source),by: {$0.key1)
        var grouped2 = [KeyType1 : [KeyType2? : [ValueType]]]()

        for pair in grouped {
            if let key = pair.key {
                grouped2[key] = Dictionary(grouping: pair.value,by: {$0.key1})
            }
        }


        print(grouped2)

这正是我想要的结果:两级数组字典。

但是我怀疑,有一种更简单的方法可以达到相同的结果,而无需手动插入每个键/值对。

yanghao19840201 回答:字典init(grouping:by :),分为2级-简化代码

您可以通过进行init(grouping:by:)调用,然后进行mapValues调用来完成此操作,该调用进一步将每个“组”映射到另一个字典中。然后,init(grouping:by:)将使用第二个分组密钥再次创建此字典。

let grouped = Dictionary(grouping: source,by: firstKey)
    .mapValues { Dictionary(grouping: $0,by: secondKey) }

例如,要首先将一组数字按其% 2值,然后按其% 4值进行分组:

let source = [1,2,3,4,5,6,7,8,9,10,11,12,13]
let grouped = Dictionary(grouping: source,by: { $0 % 2 })
    .mapValues { Dictionary.init(grouping: $0,by: { $0 % 4 }) }
print(grouped)
本文链接:https://www.f2er.com/3142988.html

大家都在问