代码之家  ›  专栏  ›  技术社区  ›  SwiftyJD

如何在数组中筛选特定键的值?

  •  0
  • SwiftyJD  · 技术社区  · 9 年前

    我们有返回数组的json值:

      "sentMoney": [
                    {
                        "amount": 3840.83,
                        "currency": "MXN",
                        "isMajor": false
                    },
                    {
                        "amount": 200,
                        "currency": "USD",
                        "isMajor": true
                    }
                ]
    

     let filteredItem = self.postTransferSuccess?.sentMoney.filter{$0["sentMoney"]}[0]
                        self.emailMessage.amount = filteredItem
    

    感谢您的帮助!

    2 回复  |  直到 9 年前
        1
  •  1
  •   Lamour    9 年前

    自从你 sentMoney 是具有 array of dictionary 有价值,你应该这样做:

     let resultObj =  (dict["sentMoney"] as? [[String:Any]])?.filter({ ($0["amount"] as? Double) == someValue }).first // dict should be the name of your dictionary
    

    请记住,您的数据应该如下所示,因此没有大括号:

    var dict = ["sentMoney": [
       ["amount": 3840.83,"currency": "MXN", "isMajor": false],
       ["amount": 200.0,"currency": "USD","isMajor": true]
      ]
    ]
    

    第二种选择是将字典转换为结构,这样更容易迭代。

    struct Item {
        let amount:Double
        let currency:String
        let isMajor:Bool
    
    
        init?(_ dict:[String:Any]?) { //<-- failable init will return a nil if there an empty key
        guard let _dict = dict,
        let amount = _dict["amount"] as? Double,
        let currency = _dict["currency"] as? String,
        let isMajor = _dict["isMajor"] as? Bool
            else { return nil }
    
        self.amount = amount
        self.currency = currency
        self.isMajor = isMajor
       }
    
    }
    

    现在,当您需要迭代时,您将执行以下操作: var someValue=200.0

     if let arr = dict["sentMoney"] as? [[String:Any]] {
            let items = arr.flatMap({ Item($0)}) //<-- will remove any optional item from your list
            let singleItem = items.first { $0.amount == someValue } 
         // or arr.flatMap({ Item($0) }).filter({ $0.amount == someValue}).first
      }
    

    (侧节点) 避免使用 ! 无论如何,使用if-let或guard语句打开您的期权包装。

        2
  •  0
  •   gadu    9 年前

    我不完全确定你的问题是什么。 .filter 这不是正确的函数吗 用于删除数组/集合中不需要的元素。(因此,使用条件进行过滤,只有当该条件的计算结果为true时,它才会将该值复制到新集合)。

    你可能要找的是 .map .

    let amountsOnlyArray = sentMoney.map({ $0["amount"] })
    

    这会给你 [3840.43, 200]

    思考 你应该能够做到

    let firstAmountOnly = sentMoney[0]["amount"]
    

    请注意 amountsOnlyArray 实际上是类型 [Any] 所以你得找个地方做些演员。

    注意,这假设您有某种 sentMoney:[String:Any] 我假设在给定初始代码过滤器的情况下收集 sentMoney