【问题标题】:Compare String Array with Dictionary in Swift 3在 Swift 3 中比较字符串数组和字典
【发布时间】:2017-07-03 15:26:45
【问题描述】:

我有字符串数组let filterClassName = ["A","B"]

现在我的字典看起来像:

var responseArray: [[String: Any]] = []

responseArray.append(["id": 1,"name": "Prateek", "className": "A"])
responseArray.append(["id": 1,"name": "rateek", "className": "B"])
responseArray.append(["id": 3,"name": "ateek", "className": "C"])
responseArray.append(["id": 4,"name": "teek", "className": "D"])
responseArray.append(["id": 5,"name": "eek", "className": "A"])
responseArray.append(["id": 6,"name": "ek", "className": "E"])

现在来自responseArray 这是我的字典,我想要所有与filterClassName 中提到的类名匹配的值

所以,我应该得到以下数组的输出:

["id": 1,"name": "Prateek", "className": "A"],["id": 1,"name": "rateek", "className": "B"],["id": 5,"name": "eek", "className": "A"]

提前致谢!

这是我尝试过的:

for value in filterClassName {
    let cal = responseArray.filter { (($0["className"] as! String).contains(value)) }
    for value in cal {
        let valuesss = value
        print ("valuesss" + String(describing: valuesss))
    }
}

我上面的答案非常基本,但我希望这样的东西可以工作:

let cal = responseArray.filter { (($0["className"] as! String).contains(filterClassName)) }

简而言之,单行过滤,没有 for 循环,因为我讨厌它们!

【问题讨论】:

  • 你试过什么?我们不喜欢回答没有事先努力的问题。
  • @Alexander:已编辑!
  • 这是对字典的不当使用——您应该创建一个结构来表示响应。然后过滤变得更简单。
  • @Hamish 这是我从字典中的 web 服务获得的数据。我正在寻找更少的代码
  • @P.J 与其寻找最短的代码,不如寻找最高效的代码。

标签: arrays swift string dictionary


【解决方案1】:

你很接近,但反过来:

let filteredItems = responseArray.filter{ filterClassName.contains($0["className"] as! String) } 

然而——正如 Hamish 在 cmets 中提到的——使用自定义结构更有效。

您的代码:

let filterClassName = ["A","B"]

var responseArray: [[String: Any]] = []

responseArray.append(["id": 1,"name": "Prateek", "className": "A"])
responseArray.append(["id": 1,"name": "rateek", "className": "B"])
responseArray.append(["id": 3,"name": "ateek", "className": "C"])
responseArray.append(["id": 4,"name": "teek", "className": "D"])
responseArray.append(["id": 5,"name": "eek", "className": "A"])
responseArray.append(["id": 6,"name": "ek", "className": "E"])

要添加的代码:

struct Student {
    let name, className : String
    let id : Int

    init?(dictionary: [String:Any]) {
        guard let id = dictionary["id"] as? Int,
            let name = dictionary["name"] as? String,
            let className = dictionary["className"] as? String else { return nil }
        self.id = id
        self.name = name
        self.className = className
    }
}

let students = responseArray.flatMap { Student(dictionary:$0) }
let filteredItems = students.filter{ filterClassName.contains($0.className) }
print(filteredItems)

【讨论】:

  • 谢谢,这是我所期待的!
【解决方案2】:

您必须检查filterClassName 数组是否包含类名。

let filteredResponse = responseArray.filter { filterClassName.contains($0["className"] as! String) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多