Dictionary init(grouping:by:), 2 levels - 简化代码
Dictionary init(grouping:by:), 2 levels - simplifying code
当我需要按 属性. 对数组元素进行分组时,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: {[=12=].key1)
var grouped2 = [KeyType1 : [KeyType2? : [ValueType]]]()
for pair in grouped {
if let key = pair.key {
grouped2[key] = Dictionary(grouping: pair.value, by: {[=12=].key1})
}
}
print(grouped2)
这正是我想要的结果:数组的二级字典。
但我怀疑,有一种更简单的方法可以实现相同的结果,而无需手动对每个 key/value 对进行交互。
您可以通过调用 init(grouping:by:)
,然后调用 mapValues
,进一步将每个 "group" 映射到另一个字典中。这个字典将由 init(grouping:by:)
使用第二个分组键再次创建。
即
let grouped = Dictionary(grouping: source, by: firstKey)
.mapValues { Dictionary(grouping: [=10=], 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: { [=11=] % 2 })
.mapValues { Dictionary.init(grouping: [=11=], by: { [=11=] % 4 }) }
print(grouped)
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: {[=12=].key1)
var grouped2 = [KeyType1 : [KeyType2? : [ValueType]]]()
for pair in grouped {
if let key = pair.key {
grouped2[key] = Dictionary(grouping: pair.value, by: {[=12=].key1})
}
}
print(grouped2)
这正是我想要的结果:数组的二级字典。
但我怀疑,有一种更简单的方法可以实现相同的结果,而无需手动对每个 key/value 对进行交互。
您可以通过调用 init(grouping:by:)
,然后调用 mapValues
,进一步将每个 "group" 映射到另一个字典中。这个字典将由 init(grouping:by:)
使用第二个分组键再次创建。
即
let grouped = Dictionary(grouping: source, by: firstKey)
.mapValues { Dictionary(grouping: [=10=], 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: { [=11=] % 2 })
.mapValues { Dictionary.init(grouping: [=11=], by: { [=11=] % 4 }) }
print(grouped)