Как отфильтровать вложенный массив SwiftyJSON

У меня есть SwiftyJSON массив, который вложен в несколько уровней, и мне нужно отфильтровать массив на основе значения на самом низком уровне. Ниже приведен пример массива. Мне нужно отфильтровать Active == true, Каков наиболее эффективный способ сделать это?

var colors = JSON([
"Apple" : [
        "Yellow" : [
            "Active" : true,
            "Working" : true,
            "Value" : 0
        ],
        "Red" : [
            "Active" : false,
            "Working" : true,
            "Value" : 0
        ]
],
"Banana" : [
        "Blue" : [
            "Active" : false,
            "Working" : true,
            "Value" : 0
        ],
        "Green" : [
            "Active" : true,
            "Working" : true,
            "Value" : 0
        ]
]
])

Желаемый результат:

"Apple" : [
        "Yellow" : [
            "Active" : true,
            "Working" : true,
            "Value" : 0
        ]
],
"Banana" : [
        "Green" : [
            "Active" : true,
            "Working" : true,
            "Value" : 0
        ]
]

3 ответа

Решение

Проверь это

var filteredArray = [JSON]()

for item in colors {
    for subItem in item.1 {
        if subItem.1["Active"].boolValue {
           filteredArray.append(JSON([item.0:JSON([subItem.0:subItem.1])]))
        }
    }
}

print(filteredArray)

Выход - массив словарей отфильтрованных под-словарей с активным истиной:

[{
  "Apple" : {
    "Yellow" : {
      "Working" : true,
      "Value" : 0,
      "Active" : true
    }
  }
}, {
  "Banana" : {
    "Green" : {
      "Working" : true,
      "Value" : 0,
      "Active" : true
    }
  }
}]
        var result = [String:[String:JSON]]()
        for (key, json) in colors.dictionaryValue {
            let filtered = json.dictionaryValue.filter{$0.1["Active"].boolValue}
            guard filtered.count > 0 else { continue }

            var subDic = [String:JSON]()
            filtered.forEach{subDic[$0.0] = $0.1}
            result[key] = subDic
        }
        print(result)

Вы можете создать цикл, который будет читать все цвета, и в этом цикле создать цикл, который будет читать другие элементы во втором массиве. Во втором случае вы проверяете, является ли элемент действительным или нет, и сохраняете его в другом массиве.

let activeItems = []

for item in colors {
   for i in item as NSDictionary {
      if i.objectForKey("Active") == true {
         activeItems.addObject(i)
      }
   }
}
Другие вопросы по тегам