2016-03-03 30 views
0

我在一個陣列中的下列對象:夫特:使用字典的濾波器陣列高階函數

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)約翰,(3)彼得,(4)瑪麗,(1)鮑勃

如果我能得到字典的數組像下面將是理想的:

[["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) 
} 

問題:有沒有更好的方法可以使用高階函數來實現這一點,使其變得簡單?如果是這樣,代碼示例會很好

回答

2

您正在尋找NSCountedSet。這是一個單行:

let cs = NSCountedSet(array:objArray) 

現在cs知道所有有知道的。它現在是微不足道的,形成你的結果字典(但說真的,我不明白爲什麼你甚至需要它; NSCountedSet cs本身已經持有該信息):

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

'讓結果= {cs.map [「qty」:cs.countForObject($ 0),「obj」:$ 0]}'。有點更短:) – Eendje

+0

@Eendje我同意,我會改變它。但我仍然認爲他甚至不需要字典,因爲NSCountedSet持有信息 - 對象和它們的計數。 – matt

+0

這很美!謝謝。 – user1107173