【问题标题】:Swift: Filter Array of Dictionary Using High Order FunctionSwift:使用高阶函数过滤字典数组
【发布时间】:2016-03-03 02:02:07
【问题描述】:

我在一个数组中有以下对象:

let john = ["name": "John", "Age" : "10", "Gender" : "Male", "City" : "SF"]
let peter = ["name" : "peter", "Age" : "12", "Gender" : "Male", "City" : "NY"]
let mary = ["name" : "mary", "Age" : "14", "Gender" : "Female", "City" : "TX"]
let bob = ["name" : "bob", "Age" : "10", "Gender": "Male" , "City" : "FL"]

var objArray = [john, john, peter, john, peter, mary, mary, bob, john, mary, peter, mary]

objArray 由 (4) john, (3) peter, (4) mary, (1) bob 组成

如果我能得到如下的字典数组将是理想的:

[["qty": 4, "obj": john], 
 ["qty": 3, "obj": peter], 
 ["qty": 4, "obj": mary], 
 ["qty": 1, "obj": bob]]

我尝试过的:

var copyOfObjArray = objArray
var newArray = [[:]]

for obj in objArray{    
    let name = obj["name"]
    let age = obj["age"]

    print(name)
    var i = 0

    for copiedObj in copyOfObjArray{
        if copiedObj["name"] == name && copiedObj["age"] == age {
            i++
        }
    }

    let newDict = ["qty" : i, "obj" : obj]
    //I am not sure how to remove all the objects that are similar
    let index = copyOfObjArray.indexesOf(obj)

    newArray.append(newDict)
}

问题:有没有更好的方法来使用简单的高阶函数来完成此任务?如果是这样,代码示例会很棒

【问题讨论】:

    标签: swift generics swift2


    【解决方案1】:

    您正在寻找 NSCountedSet。这是一个单行:

    let cs = NSCountedSet(array:objArray)
    

    现在cs 知道所有需要知道的了。现在形成你的结果字典是微不足道的(但实际上,我不明白你为什么需要它;NSCountedSet cs 它自己 已经保存了信息):

    let result = cs.map { ["qty": cs.countForObject($0), "obj": $0] }
    

    【讨论】:

    • let results = cs.map { ["qty": cs.countForObject($0), "obj": $0] }。短一点:)
    • @Eendje 我同意,我会改变它。但我仍然认为他甚至不需要字典,因为 NSCountedSet 保存着信息 - 对象及其计数。
    • 这太美了!谢谢。
    • 嗨@matt 我的要求改变了。或许你也知道这个问题的答案:stackoverflow.com/questions/35783399/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多