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

Arrays 如何在数组中筛选特定键的值?,arrays,swift,filtering,Arrays,Swift,Filtering,我们有返回数组的json值: "sentMoney": [ { "amount": 3840.83, "currency": "MXN", "isMajor": false }, { "amount": 200,

我们有返回数组的json值:

  "sentMoney": [
                {
                    "amount": 3840.83,
                    "currency": "MXN",
                    "isMajor": false
                },
                {
                    "amount": 200,
                    "currency": "USD",
                    "isMajor": true
                }
            ]
我要做的是过滤它,这样我就可以得到amount键的值。这是我到目前为止看到的,但我收到一条“没有下标成员”错误消息:

 let filteredItem = self.postTransferSuccess?.sentMoney.filter{$0["sentMoney"]}[0]
                    self.emailMessage.amount = filteredItem
感谢您的帮助

因为您的sentMoney是一个具有dictionary has value数组的键,所以您应该执行以下操作:

 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
  }

侧节点避免使用!无论如何,请使用“如果让”或“保护”语句来打开您的选项包装。

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

你可能要找的是地图

例如:

let amountsOnlyArray = sentMoney.map({ $0["amount"] })
这会给你[3840.43200]

如果你出于某种原因只想要第一项,而想忽略它,我认为你应该能够做到

let firstAmountOnly = sentMoney[0]["amount"]
请注意,amountsOnlyArray实际上是[Any]类型,因此您必须在某处进行一些转换


注意,这假设您有某种类型的sentMoney:[String:Any]集合,我假设您的初始代码过滤器为sentMoney

创建事务类型ie类或结构。让它有3个属性:金额、货币和isMajor。然后根据它的amount属性进行排序,否则会有一长串的转换,类似于Lamar的回答。这段代码非常不安全,因为它使用了force unwrapping。我有一个旁注:@Gaboxfilter{$0.amount==someValue}。首先不必要地迭代整个数组。您应该使用firstwhere:{…}方法,而不是使用change as!双重身份?双重的0,作为!串到as?一串像博尔到阿斯?布尔??虚假与虚假![[String:Any]]到as?[[String:Any]]??[]@LeoDabus我当时很忙,我确实提供了解决方案,但现在我做了必要的更改: