Как получить сгруппированный массив struct в swift 4? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть массив структур, в которых идентификатор компонента может быть одинаковым для двух или более элементов.Код для того же, как показано ниже:

struct Cart {
    var bundleId: Int = 0
    var ingredientId: Int = 0
}

var array:[Cart] = []
array.append(Cart(bundleId: 1, ingredientId: 1))
array.append(Cart(bundleId: 2, ingredientId: 2))
array.append(Cart(bundleId: 3, ingredientId: 2))
array.append(Cart(bundleId: 4, ingredientId: 5))
array.append(Cart(bundleId: 5, ingredientId: 5))
array.append(Cart(bundleId: 6, ingredientId: 6))
print(array)

То, что я ожидаю в качестве вывода, является массивом с элементами, сгруппированными в соответствии с одним и тем же ингредиентом, например

[
   [Cart(bundleId: 1, ingredientId: 1)],
   [Cart(bundleId: 2, ingredientId: 2),Cart(bundleId: 3, ingredientId: 2)],
   [Cart(bundleId: 4, ingredientId: 5),Cart(bundleId: 5, ingredientId: 5)],
   [Cart(bundleId: 6, ingredientId: 6)],
   ............
   .......
]

PS: ингридиенты ингридиентов не фиксированы, и у нас нет отдельного массива для них.

Как этого добиться, используя функции высшего порядка?

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете использовать API grouped, предоставляемый Dictionary, чтобы преобразовать ваш массив в словарь Carts, сгруппированный по ingredientId;

let groupedDictionary = Dictionary(grouping: array) { $0.ingredientId }

Если вам необходимо преобразоватьэтот словарь в массив;

let twoDimensionalArray = groupedDictionary.map { $0.value }
...