在具有 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 上应用过滤器并计算平均值的主要内容,如果未能解决你的问题,请参考以下文章

具有 nil 值的 NSDictionary 快速 KVC

如何在序列化为 json 之前将 NSDictionary 添加到另一个 NSDictionary

如何创建具有多个键的 NSDictionary?

NSDictionary 具有空值

从 NSDictionary 中按键获取具有特定值的对象

具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?