swift - 如何使用字典对同一键的值求和?
问题描述
我有一本看起来像这样的字典:
(value: 21.0, id: "JdknnhshyrY56AXQcAiLcYtbVlz2") ---> This has a second entry
(value: 18.0, id: "nIvb519nNfMtlVNnsQJ5w4bRbFp2")
(value: 14.0, id: "tlKqcxHdPoemwGqJsyLhERnuQ3Z2")
(value: 5.0, id: "JdknnhshyrY56AXQcAiLcYtbVlz2")]---> This is the second entry
如果有重复条目,我想将值添加到相同的 id。像这样的东西:
(value: 26.0, id: "JdknnhshyrY56AXQcAiLcYtbVlz2") ---> Value has added and key has become only one
(value: 18.0, id: "nIvb519nNfMtlVNnsQJ5w4bRbFp2")
(value: 14.0, id: "tlKqcxHdPoemwGqJsyLhERnuQ3Z2")]
我已经尝试使用 map 方法,但一直在工作,添加了值,但 id 上的多个条目仍然保持多个条目。
我怎样才能达到结果。
解决方案
始终建议将您的
Dictionary
(具有最终归入[AnyHashable : Any]
类别的异构类型的值)转换为Typed对象。使用类型化的对象,操作或其他计算变得很方便。
在上述陈述的前提下,您将执行以下操作:
let objects = [Object]() // this would be you array with actual data
let reduced = objects.reduce(into: [Object]()) { (accumulator, object) in
if let index = accumulator.firstIndex(where: { $0.id == object.id }) {
accumulator[index].value += object.value
} else {
accumulator.append(object)
}
}
在哪里Object
:
struct Object {
var value: Double
let id: String
}
现在,如果您想知道如何将您的Dictionary
to & fromObject
类型转换,请查看完整代码:
let arrayOfDictionary = [["value": 21.0, "id": "JdknnhshyrY56AXQcAiLcYtbVlz2"],
["value": 18.0, "id": "nIvb519nNfMtlVNnsQJ5w4bRbFp2"],
["value": 14.0, "id": "tlKqcxHdPoemwGqJsyLhERnuQ3Z2"],
["value": 5.0, "id": "JdknnhshyrY56AXQcAiLcYtbVlz2"]]
struct Object: Codable {
var value: Double
let id: String
}
do {
let jsonData = try JSONSerialization.data(withJSONObject: arrayOfDictionary, options: [])
let objects = try JSONDecoder().decode([Object].self, from: jsonData)
let reduced = objects.reduce(into: [Object]()) { (accumulator, object) in
if let index = accumulator.firstIndex(where: { $0.id == object.id }) {
accumulator[index].value += object.value
} else {
accumulator.append(object)
}
}
let encodedObjects = try JSONEncoder().encode(reduced)
let json = try JSONSerialization.jsonObject(with: encodedObjects, options: [])
if let reducedArrayOfDictionary = json as? [[String : Any]] {
print(reducedArrayOfDictionary)
}
} catch {
print(error)
}
推荐阅读
- html - 如何在 html/css 中将文本与图像对齐
- amazon-web-services - 向我的客户证明他们在 AWS 中的数据已加密
- javascript - 收到 Typescript 错误说,某些类型不能分配给类型为“ReducerWithoutAction”的参数
'? - elasticsearch - 如何在 Kubernetes 副本集中部署 Elasticsearch 集群?
- javascript - TypeORM 与除 id 之外的字段的关系
- ruby-on-rails - 位于 lib 目录文件中的方法的未定义局部变量或方法
- maven - Netbeans 的“服务”选项卡中缺少 Maven 存储库节点
- confusion-matrix - 机器学习:混淆矩阵中(行,列)变量(真值,预测)的约定?
- windows - WinDbg反汇编ntdll代码中连续多个int3的目的是什么?
- aws-lambda - 捆绑为 docker 映像的本机 Spring 函数在 AWS lambda 上不起作用