如何过滤嵌套的 SwiftyJSON 数组

Posted

技术标签:

【中文标题】如何过滤嵌套的 SwiftyJSON 数组【英文标题】:How to filter a nested SwiftyJSON array 【发布时间】:2016-10-11 20:15:29 【问题描述】:

我有一个嵌套多个级别的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
        ]
]

【问题讨论】:

数组是一个字典。 @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)

输出是过滤的子词典的词典数组,其中 Active 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)
      
   

【讨论】:

这不起作用,因为数组是 JSON,给出错误cannot convert value of type (String, JSON) to type NSDictionary 不是一个数组。 @MikeDeluca 不需要转换成NSDictionary,可以通过SwiftyJSON的简单[JSON]数组来解决。检查我的答案【参考方案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.forEachsubDic[$0.0] = $0.1
            result[key] = subDic
        
        print(result)

【讨论】:

以上是关于如何过滤嵌套的 SwiftyJSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 和 SwiftyJSON 访问嵌套的 JSON 值?

如何使用 SwiftyJSON 从深度嵌套的 JSON 字典中获取字符串 [重复]

如何在javascript中过滤数组内的嵌套对象

如何让 vuejs 过滤器为数组内的嵌套项工作?

如何通过嵌套数组字段(数组中的数组)过滤Spark sql?

HiveQL:如何编写查询以根据嵌套的 JSON 数组值选择和过滤记录