2016-02-28 3 views
1

У меня есть массив с текстовым полем является категорию
["id", "cat", "item_name"]:

["1", "cat1", "Something"]
["2", "cat2", "Something"]
["3", "cat1", "Something"]
["4", "cat1", "Something"]
["6", "cat1", "Something"]
["7", "cat2", "Something"]
["8", "cat2", "Something"]
["9", "cat2", "Something"]
Распад/разделить массив на небольшие массивы

Чтобы иметь возможность использовать эту категорию в разделах UITableView, мне нужно разделить массив на меньшие массивы - справа.

Так что мне нужно иметь:

dic["cat1"][array of items with cat1 in field]() 
dic["cat2"][array of items with cat2 in field]() 

Как бы вы о том, что делать?

ответ

2

Я бы не использовал reduce или map для этого. Вместо этого я бы сделал что-то вроде этого

var dict: [String: [[String]]] = [:] 
arr.forEach() { 
    if dict[$0[1]] == nil { 
     dict[$0[1]] = [] 
    } 

    dict[$0[1]]?.append($0) 
} 

Однако я бы рекомендовал вам изменить структуру кода и модели для использования структуры. Таким образом, вместо вложенного массива выполните следующие действия

struct Item { 
    let id: String 
    let category: String 
    let name: String 
} 

Тогда код станет намного чище и проще читать

let arr2 = [ 
    Item(id: "1", category: "cat1", name: "Something"), 
    Item(id: "2", category: "cat2", name: "Something"), 
    Item(id: "3", category: "cat1", name: "Something") 
] 
var dict2: [String: [Item]] = [:] 
arr2.forEach() { 
    if dict2[$0.category] == nil { 
     dict2[$0.category] = [] 
    } 

    dict2[$0.category]?.append($0) 
} 
+0

Я не следовать? В этом случае у вас будет по 2 ключа каждый с массивом элементов в качестве значения. –

+1

Мой плохой, возможно, я больше не должен комментировать мой телефон: p – Eendje

+1

Вы можете использовать: 'dict2 [$ 0.category] = (dict2 [$ 0.category] ?? []) + [$ 0]', чтобы сделать его короче хоть :) – Eendje

Смежные вопросы