不使用for循环的数组迭代是swift iOS

时间:2018-03-31 08:23:43

标签: ios swift3

我有一个类似的数组:

let responseArray : [[String : Any]] = [["id": 1, "sub_array": [["id": 2, "sub_array": [["id": 3], ["id": 4]]],["id": 5, "sub_array": [["id": 6], ["id": 7]]]]], ["id": 8, "sub_array": [["id": 9], ["id": 10]]]]
print(responseArray as! NSArray)

我希望将其合并到UITableView

中显示

期待结果如:

let expectedOutput : [[String : Any]] = [["id" : 1], ["id" : 2], ["id" : 3], ["id" : 4], ["id" : 5], ["id" : 6], ["id" : 7], ["id" : 8], ["id" : 9], ["id" : 10]]
print(expectedOutput as! NSArray)

我可以通过使用循环来实现它,但是如何在不使用循环的情况下实现它?

2 个答案:

答案 0 :(得分:0)

在没有明确使用flatten循环的情况下为这个数据结构编写for a in b函数当然是可能的,但考虑到数据的性质,循环和递归调用是恕我直言不可避免的。 / p>

func flatten(_ array: [[String: Any]]) -> [[String: Any]] {
    var result = [[String: Any]]()

    array.forEach { dict in
        dict.forEach { (key, val) in
            if let v = val as? [[String: Any]] {
                result.append(contentsOf: flatten(v))
            } else {
                result.append([key: val])
            }
        }
    }

    return result
}

答案 1 :(得分:0)

您可以 Swift CollectionTypes(数组,词典,集合)有一个强大的好的方法提供许多替代解决方案 in comparison for-loop

这是: -

我们将执行 3 任务,如下所示:

  • 首先,我们将获取不属于sub_array ID
  • 其次,我们将获取那些 ID ,它们是sub_array 部分,但 n 是内部sub_array的一部分
  • 第三个也是最后一个,我们将获取 sub_array内部sub_array 部分 ID

        let responseArray : [[String : Any]] = [["id": 1, "sub_array": [["id": 2, "sub_array": [["id": 3], ["id": 4]]],["id": 5, "sub_array": [["id": 6], ["id": 7]]]]], ["id": 8, "sub_array": [["id": 9], ["id": 10]]]]
    
        let arrExrernalIds = responseArray.flatMap({$0["id"] as? Int ?? 0})
        print(arrExrernalIds) // output :- [1, 8]
    
        let arrSub_ArrayIDs =   responseArray.flatMap({$0["sub_array"] as? [[String:Any]] ?? []}).flatMap({$0["id"] as? Int ?? 0})
    
        print(arrSub_ArrayIDs) // output :- [2, 5, 9, 10]
    
        let arrSubArray_SubArrayIDs = responseArray.flatMap({$0["sub_array"] as? [[String:Any]] ?? []}).flatMap({$0["sub_array"] as? [[String:Any]] ?? []}).flatMap({$0["id"] as? Int ?? 0})
    
        print(arrSubArray_SubArrayIDs) // output :- [3, 4, 6, 7]
    
        var allIDs = (arrExrernalIds + arrSub_ArrayIDs + arrSubArray_SubArrayIDs).sorted()
    
        print(allIDs) // output :- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
        var expectedOutput = [[String:Any]]()
    
        for id in allIDs {
            expectedOutput.append(["id":id])
        }
    
        print(expectedOutput) // output :- [["id": 1], ["id": 2], ["id": 3], ["id": 4], ["id": 5], ["id": 6], ["id": 7], ["id": 8], ["id": 9], ["id": 10]]
    

只有4行代码,您可以获得所需的数组。