在具有 JSON 源的 NSDictionary 上应用过滤器并计算平均值
Posted
技术标签:
【中文标题】在具有 JSON 源的 NSDictionary 上应用过滤器并计算平均值【英文标题】:Applying filter and calculating Average on NSDictionary with JSON origin 【发布时间】:2017-05-09 21:28:24 【问题描述】:我在这里阅读了一些帖子并在谷歌上搜索过,但仍然无法理解如何使用快速过滤器功能进行简单过滤。我是 Swift 和函数式编程的新手,如果这太基础了,请见谅。
我有以下 JSON:
"-KjirKH7Bo7c5vq7ZH9N" =
rank = 2;
placa = "xxx-0003";
uid = yNpL0uzI5LRj6etFGVgoWYEK2E52;
;
"-Kjiyi_i7FLl6dks6xKL" =
rank = 5;
placa = "xxx-0003";
uid = yNpL0uzI5LRj6etFGVgoWYEK2E52;
;
我能够创建一个值数组:
if let dict = snapshot.value as? NSDictionary
let myArray = dict.map$0.value //array of values
创建这个:
[
rank = 5;
placa = "xxx-0003";
uid = yNpL0uzI5LRj6etFGVgoWYEK2E52;
,
rank = 2;
placa = "xxx-0003";
uid = yNpL0uzI5LRj6etFGVgoWYEK2E52;
]
我现在的目标是:
应用过滤器以仅检索属性“rank”大于 0 的项目。 之后我想计算项目的平均排名(在本例中为 2+5/2 = 3.5)。
我试过这个:
myArray.filter$0.rank > 0
但它失败了,“'Any' 类型的值没有成员 'rank'”
知道如何过滤这个数组吗? 我已经尝试过使用 NSPredicate,但我想知道是否有某种方法可以利用本机过滤器。
【问题讨论】:
【参考方案1】:看起来你有两个问题:
-
myArray 的项目属于
Any
类型,实际上它们是字典,因此您必须帮助编译器理解这一点。操作方法如下:
let myArray: [[String: Any]] = dict.map $0.value
-
因为
myArray
包含字典,你必须修改过滤器中的访问值:
myArray.filter (($0["rank"] as? Int) ?? 0) > 0
希望对你有帮助!
【讨论】:
对于第 1 项,我得到:无法将 'Any' 类型的值转换为闭包结果类型 '[String : Any]'【参考方案2】:myArray.filter ((($0 as! NSDictionary)["rank"] as? Int) ?? 0) > 0
将 K.K Cast $0 的答案附加到 NSDictionary。我希望这会奏效
【讨论】:
也不起作用,它返回一个空数组。我想我必须创建一个结构来组织它以上是关于在具有 JSON 源的 NSDictionary 上应用过滤器并计算平均值的主要内容,如果未能解决你的问题,请参考以下文章