2016-06-09 4 views
2

У меня есть массив бизнес-объектов. Каждый бизнес-объект содержит массив пар ключ-значение, один из которых может быть вложенным массивом объектов ContentBlocks.Swift фильтр вложенного массива объектов

var masterArray = [ 
     Business(busName: "Dave's Cafe", busId: 1, website: "http://www.davescafe.com", latLong: (45.541, -45.609), 
      actions: [["title": "About Us", "contentId": "123", "actionType": "content"], 
       ["title": "Website", "url": "http://www.davescafe.com", "actionType": "web"]], 
      contentBlocks:[ 
       ContentBlock(busName: "Dave's Cafe", busId: 1, contentId: "123", title: "Testola!", body: "Hello there!") 
      ]), 
     Business(busName:... 
] 

Я могу выбирать массив для возврата к конкретной компании, соответствующей уникальный busId, используя что-то вроде этого:

let rtnArray = masterArray.filter{$0.busId == id} 
    if rtnArray.count == 1{ 
     return rtnArray[0] 
    } else { 
     return // feedback that no matches were found 
    } 

Кроме того, я хотел бы вернуть определенную contentBlock путем фильтрации по уникальному contentId (при необходимости я также могу передать busId владельца «Бизнес»). Я действительно изо всех сил пытаюсь двигаться вперед, поэтому любые указатели в правильном направлении были бы замечательными.

ответ

3

Вот решение, что я думаю, вы спрашиваете:

var contentBlocks = masterArray 
         .flatMap{$0.contentBlocks} 
         .flatMap{$0} 
         .filter{$0.contentId == "123"} 

Выводит [ContentBlock], содержащее все ContentBlock объектов, которые соответствуют фильтру из всех Business объектов.

  1. Первый flatMap делает список Business эс в [ContentBlock?]
  2. flatMap сглаживает [ContentBlock?] в [ContentBlock]
  3. The [ContentBlock] фильтруется
+0

благодарит за отличный ответ. Когда я пытаюсь это сделать, компилятор жалуется: «Значение типа [ContentBlock]» не имеет ни одного члена «contentId'' в последней строке. Любая идея, что я делаю неправильно? – James

+0

Ну, если contentID является ключом, он будет написан как '$ 0 [" contentId "]' для доступа к значению этого ключа. Компилятор дает вам ошибку, потому что в настоящее время он доступен, как свойство, которое я предполагаю, что это не так. – NSGangster

+0

@NSGangster Спасибо - я пробовал это, но он снова жалуется, на этот раз с 'Не могу подстроить значение типа '[ContentBlock]' с индексом типа« String ». Поэтому я пробовал без кавычек - та же ошибка ... Хммм! – James

1

Попробуйте это:

// The busId and contentId you want to find 
let busId = 1 
let contentId = "123" 

let contentBlocks = masterArray.flatMap { 
    $0.contentBlocks.filter { $0.busId == busId && $0.contentId == contentId } 
} 
+0

Спасибо. Ответ http://stackoverflow.com/a/37730229/131385 - это то, о чем я думал, возможно, возможно (требуется только contentId). Ваше предложение будет идеально подходит для аналогичной, но немного другой структуры данных + фильтр, который мне нужен в другом месте в моем приложении. – James

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