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

#json #swift #swifty-json

#json #swift #swifty-json

Вопрос:

У меня есть 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
        ]
]
  

Комментарии:

1. Массив представляет собой словарь.

2. @MikeDeluca Проверь мой ответ один раз.

Ответ №1:

Проверьте это

 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)
  

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

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

Ответ №2:

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

 let activeItems = []

for item in colors {
   for i in item as NSDictionary {
      if i.objectForKey("Active") == true {
         activeItems.addObject(i)
      }
   }
}
  

Комментарии:

1. Это не работает, потому что массив является JSON, выдавая ошибку cannot convert value of type (String, JSON) to type NSDictionary

2. Это не массив.

3. @MikeDeluca Нет необходимости преобразовывать его в NSDictionary , это можно решить с помощью простого [JSON] массива SwiftyJSON . Проверьте мой ответ

Ответ №3:

         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)