Json reduce函数正在打印空字典[:]
在这篇文章中,我成功地将字典键缩减为伪代码,而没有真正的json模型。我在上一个问题中实现的目标是只返回具有匹配值的键。因此,输出的是一个类似于以下内容的字典:“@jade”,“@kalel”]。这正是我所需要的。当然,可能还有其他匹配项,我也想返回这些匹配项 现在我有了一个正确的json模型,reduce函数正在打印一个空字典Json reduce函数正在打印空字典[:],json,swift,dictionary,reduce,codable,Json,Swift,Dictionary,Reduce,Codable,在这篇文章中,我成功地将字典键缩减为伪代码,而没有真正的json模型。我在上一个问题中实现的目标是只返回具有匹配值的键。因此,输出的是一个类似于以下内容的字典:“@jade”,“@kalel”]。这正是我所需要的。当然,可能还有其他匹配项,我也想返回这些匹配项 现在我有了一个正确的json模型,reduce函数正在打印一个空字典[:]。是不是.reduce中的类型导致了这个问题 所有数据都在打印,因此json和模型结构必须正确。 json 用户模型 public typealias Users
[:]
。是不是.reduce中的类型导致了这个问题
所有数据都在打印,因此json和模型结构必须正确。
json
用户模型
public typealias Users = [UserModel]
public struct UserModel: Codable {
public let name: String
public let game: String
// etc...
enum CodingKeys: String, CodingKey {
case name
case game
// etc...
游乐场
guard let url = Bundle.main.url(forResource: "Users", withExtension: "json") else {
fatalError()
}
guard let data = try? Data(contentsOf: url) else {
fatalError()
}
let decoder = JSONDecoder()
do {
let response = try decoder.decode([UserModel].self, from: data)
for userModel in response {
let userDict: [String:String] = [ userModel.name:userModel.game ]
let reduction = Dictionary(grouping: userDict.keys) { userDict[$0] ?? "" }.reduce(into: [String:[String]](), { (result, element) in
if element.value.count > 1 {
result[element.key] = element.value
}
})
// error catch etc
}
你的代码太复杂了。你只需使用
let response = try decoder.decode([UserModel].self, from: data)
let reduction = Dictionary(grouping: response, by: {$0.game}).mapValues{ usermodel in usermodel.map{ $0.name}}
你的代码太复杂了。你只需使用
let response = try decoder.decode([UserModel].self, from: data)
let reduction = Dictionary(grouping: response, by: {$0.game}).mapValues{ usermodel in usermodel.map{ $0.name}}
更新我可能误解了您想要的内容。下面还有另一个代码,请检查结果并选择一个您想要的
如果您想使用reduce(into:updateacumatingresult:)
,您可以编写如下代码
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(name: String, game: String)] = response.map {($0.name, $0.game)}
let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
if !element.game.isEmpty {
result[element.name, default: []].append(element.game)
}
}
print(reduction)
} catch {
print(error)
}
如果您喜欢使用字典
的初始值设定项,这可能适用于:
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(name: String, games: [String])] = response.map {
($0.name, $0.game.isEmpty ? [] : [$0.game])
}
let reduction = Dictionary(userArray) {old, new in old + new}
print(reduction)
} catch {
print(error)
}
两种输出:
["@jade": ["WoW"], "@kalel": ["WoW"]]
无论如何,除了userDict.keys
之外,您将loop、Dictionary(grouping:)
和reduce(into:)
组合在一起的方式使事情变得过于复杂
添加当您想获得一本带有按键的字典作为游戏时:
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(game: String, name: String)] = response.compactMap {
$0.game.isEmpty ? nil : ($0.game, $0.name)
}
let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
result[element.game, default: []].append(element.name)
}
print(reduction)
} catch {
print(error)
}
或:
输出:
["WoW": ["@jade", "@kalel"]]
更新我可能误解了您想要的内容。下面还有另一个代码,请检查结果并选择一个您想要的
如果您想使用reduce(into:updateacumatingresult:)
,您可以编写如下代码
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(name: String, game: String)] = response.map {($0.name, $0.game)}
let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
if !element.game.isEmpty {
result[element.name, default: []].append(element.game)
}
}
print(reduction)
} catch {
print(error)
}
如果您喜欢使用字典
的初始值设定项,这可能适用于:
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(name: String, games: [String])] = response.map {
($0.name, $0.game.isEmpty ? [] : [$0.game])
}
let reduction = Dictionary(userArray) {old, new in old + new}
print(reduction)
} catch {
print(error)
}
两种输出:
["@jade": ["WoW"], "@kalel": ["WoW"]]
无论如何,除了userDict.keys
之外,您将loop、Dictionary(grouping:)
和reduce(into:)
组合在一起的方式使事情变得过于复杂
添加当您想获得一本带有按键的字典作为游戏时:
do {
let response = try decoder.decode([UserModel].self, from: data)
let userArray: [(game: String, name: String)] = response.compactMap {
$0.game.isEmpty ? nil : ($0.game, $0.name)
}
let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
result[element.game, default: []].append(element.name)
}
print(reduction)
} catch {
print(error)
}
或:
输出:
["WoW": ["@jade", "@kalel"]]
@tymac我可以编译一些东西而不必花时间处理json。谢谢你的输入。这就是我所有的代码。没有什么需要处理的。Vadian和OOper都在几分钟内回答了,没有额外的代码。模型和所有东西都清晰可见。换言之,我想要一些可以复制到空s中的东西wift file,单击compile,然后查看您的问题。现在您的代码执行许多与您的问题无关的操作。它从主bundel加载一个Users.json
文件(这意味着潜在的应答者需要创建一个新的xcode项目,并创建这样的文件),它解码json(即使可以使用直接初始化的UserModel
structs重新创建相同的问题,而无需解析JSON),等等。请特别参阅:“使用尽可能少的仍然产生相同问题的代码”,“创建一个新程序,只添加查看问题所需的内容”,“消除与问题无关的任何问题"等。@tymac一些我可以编译的东西,而不必花时间处理json。谢谢你的输入。这就是我所有的代码。没有什么需要处理的。Vadian和OOper都在几分钟内回答了,没有额外的代码。模型和所有东西都清晰可见。换言之,我想要一些我可以复制到e中的东西mpty Swift file,单击compile,然后查看您的问题。现在您的代码执行许多与您的问题无关的操作。它从主bundel加载一个Users.json
文件(这意味着潜在的应答者需要创建一个新的xcode项目,并创建这样的文件),它解码json(即使可以使用直接初始化的UserModel
structs重新创建相同的问题,而无需解析JSON),等等。请特别参阅:“使用尽可能少的仍然产生相同问题的代码”,“创建一个新程序,只添加查看问题所需的内容”,“消除与问题无关的任何问题",等等。请查看添加到问题底部的新代码。如果这是正确的,我仍然得到一个类型的表达式不明确,没有更多上下文错误。删除循环。我更新了答案以将值映射到它们的名称。使用给定的JSON,不得出现错误。请查看添加到问题底部的新代码n、 如果这是正确的,我仍然得到一个类型的表达式是不明确的,没有更多的上下文错误。删除循环。我更新了答案以将值映射到它们的名称。使用给定的JSON,错误一定不会发生。谢谢。我将更新您的答案。我将@vadian的答案标记为正确,因为他首先使用了正确的算法。而不是我将投票支持你的答案。我把@vadian的答案标为正确,因为他是第一个使用正确算法的人。