按键的最后一个字符对字典中的元素进行分组 [iOS Swift 5]

Grouping Elements in Dictionary by The Last Character of The Keys [iOS Swift 5]

我有一本字典,我想按键的最后一个字符分组。这是字典:

var displayValues = ["volume_1": 1, "price_2": 6, "price_1": 2, "stock_1": 3, "volume_2": 5, "stock_2": 7]

这是我用来对它们进行分组的代码

let groupValues = Dictionary(grouping: displayValues) { [=13=].key.last! }
print(groupValues)

这是这段代码的结果

["2": [(key: "price_2", value: 6), (key: "volume_2", value: 5), (key: "stock_2", value: 7)], "1": [(key: "volume_1", value: 1), (key: "price_1", value: 2), (key: "stock_1", value: 3)]]

分组是正确的,但是,如何从字典中删除单词 keyvalue 以便它显示正在关注?

[
  "2": ["price_2": 6, "volume_2" : 5, "stock_2": 7], 
  "1": ["volume_1": 1, "price_1": 2, "stock_1": 3]
]

你快到了!!

现在你有了你想要的键和元组数组的值

您可以使用新的 reduce(into:)

将元组数组转换为字典

完整代码为

    var displayValues = ["volume_1": 1, "price_2": 6, "price_1": 2, "stock_1": 3, "volume_2": 5, "stock_2": 7];
    let dict = Dictionary(grouping: displayValues) { [=10=].key.suffix(1)}
    let final = dict. mapValues { value  in
        return value.reduce(into: [:]) { [=10=][.key] = .value }
    }
    print(final)

输出:

["2": ["price_2": 6, "volume_2": 5, "stock_2": 7], "1": ["price_1": 2, "stock_1": 3, "volume_1": 1]]

在这种情况下,Dictionary(grouping:by:) 创建一个 Dictionary 类型 [Character : [(key: String, value: Int)]]。所以这些值是 (key: String, value: Int) 元组的数组。

使用 .mapValues()(key: String, value: Int) 元组的数组转换为 Dictionary,方法是调用 Dictionary(uniqueKeysWithValues) 数组:

var displayValues = ["volume_1": 1, "price_2": 6, "price_1": 2, "stock_1": 3, "volume_2": 5, "stock_2": 7]

let groupValues = Dictionary(grouping: displayValues) { String([=10=].key.suffix(1)) }
    .mapValues { Dictionary(uniqueKeysWithValues: [=10=]) }

print(groupValues)

结果:

["1": ["stock_1": 3, "price_1": 2, "volume_1": 1], "2": ["volume_2": 5, "stock_2": 7, "price_2": 6]]

注:

为了避免 force unwrap(如果你有一个空的 String 作为键会崩溃),我使用 String([=21=].key.suffix(1)) 而不是 [= 22=].key.last!。这将使最终字典 [String : [String : Int]] 可以方便地用 String.

索引

感谢@LeoDabus 的建议。