多级赋值

48 阅读1分钟

//        let data = ["key1":["key2":["key3":["key4":"value4"]]]]

        let finishData = MVPDmHomeFeedNormalProjectItem.reformDataOnPath(path: "key1.key2.key3.key4", sourceDict: data, bottomDict: ["key4":"value5"])

         print(finishData?.keys)

        

        class func reformDataOnPath(path: String, sourceDict: [String: AnyHashable]?, bottomDict:[String: AnyHashable]) ->[String: AnyHashable]? {

            guard let sourceData = sourceDict else{return nil}

            

            // 返回值fata

            var returnData = sourceData

            // 存储数组

            var pathDataList: [[String: AnyHashable]] = []

            // 替换数据后生成的新的各级数据

            var pathNewData: [String: AnyHashable]?

            

            // 源数据

             var transformDict: [String: AnyHashable]?

             let pathList = path.split(separator: ".")

             pathList.forEach { pathStr in

     //            guard let pathKey = pathStr as? String else {return}

                 if let transform = transformDict {

                     if let result = transform[String(pathStr)] as? [String: AnyHashable] {

                         transformDict = result

                         pathDataList.append(result)

                     } else {

                         

                     }

                 } else {

                     pathDataList.append(sourceData)

                     if let transform = sourceData[String(pathStr)] as? [String: AnyHashable] {

                         transformDict = transform

                         pathDataList.append(transform)

                     }

                 }

                 

                 // 如果到了最后一个

                 if pathList.firstIndex(of: pathStr) == pathList.count - 1 {

                     pathDataList = pathDataList.reversed()

                     pathDataList.forEach { pathEveryData in

                         let index = pathDataList.firstIndex(of: pathEveryData) ?? 0

                         if (pathNewData != nil) {

                             pathNewData = pathEveryData.merging(pathNewData ?? ["qqq":"ppp"]) { _, new in

                                 return new

                             }

                             if pathList.count - index - 2 >= 0 {

                                 let pathName = pathList[pathList.count - index - 2]

                                 pathNewData = [String(pathName): pathNewData]

                             }

                         } else {

                             let pathName = pathList[pathList.count - 2]

                             pathNewData = pathEveryData.merging(bottomDict) { _, new in

                                 return new

                             }

                             pathNewData = [String(pathName): pathNewData]

                         }

                         if index == pathDataList.count - 1 {

                         }

                     }

                     

                 }

                 

             }

            return pathNewData

         }