2017-08-26 55 views
0

我正在将数据从1格式迁移到另一个格式,以便对我的iOS应用程序之一进行大型更新。这意味着当用户更新他们的应用程序时,它将他们的数据迁移到新的位置。这个新的地点有更严格的规则,并使用适当的做法(基本上,当我第一次创建应用程序,我是一个noob,目前在数据库中有不好的做法,这个新的位置仅用于良好的数据)。从NSDictionary/Dictionary中删除所有项目,其中值== -1.0

我有一切都很好地迁移,一切正常,除了我需要做最后一件事。我保存到数据库的大型字典(它使用firebase fyi)在任何地方存储-1.0应该有一个零值(我知道是坏的)。我需要做的是遍历整个字典并删除键值为-1.0的任何键。

字典的类型是[AnyHashable:Any],这是Firebase使用的类型。

到目前为止,我已经尝试过。

if let data = dataDictionary as? [AnyHashable : Any] { 

    let foundItems = data.filter { $0.value as? Double == -1.0 } 

    print(foundItems) 
} 

该计划然后遍历该找到的项目数组,并从包含它的数据字典中删除任何键。

这是数据字典的样子:

"-KpIdh_TQMG4fyfFgkdt" =     { 
       assignments =      { 
        "-KpIgH6uN19OpcuedYe1" =       { 
         assignmentGoal = "-1"; 
         assignmentName = "Information System Proposal"; 
         assignmentResult = 100; 
         assignmentWeight = 5; 
        }; 
        "-KpIgJnFlC6fhgS0NWxF" =       { 
         assignmentGoal = "-1"; 
         assignmentName = "Information System"; 
         assignmentResult = "-1"; 
         assignmentWeight = 35; 
        }; 
        "-KpIgOGSAwg_VSpDWhWR" =       { 
         assignmentGoal = "-1"; 
         assignmentName = "Process Analysis"; 
         assignmentResult = "-1"; 
         assignmentWeight = 30; 
        }; 
        "-KpIgPhu_3Zxw36xt3O4" =       { 
         assignmentGoal = "-1"; 
         assignmentName = Labs; 
         assignmentResult = "-1"; 
         assignmentWeight = 10; 
        }; 
        "-KpIgQoFEdRnLlMAq2VN" =       { 
         assignmentGoal = "-1"; 
         assignmentName = Exam; 
         assignmentResult = "-1"; 
         assignmentWeight = 20; 
        }; 
       }; 
       paperColor = 22; 
       paperGoal = 95; 
       paperName = "Systems Analysis"; 
      }; 
     }; 
     semesterCode = 17S2; 
     semesterGoal = 90; 
     semesterName = "2017 Semester Two"; 
    }; 
}; 

,这是它应该是什么样子

"-KpIdh_TQMG4fyfFgkdt" =     { 
       assignments =      { 
        "-KpIgH6uN19OpcuedYe1" =       { 
         assignmentName = "Information System Proposal"; 
         assignmentResult = 100; 
         assignmentWeight = 5; 
        }; 
        "-KpIgJnFlC6fhgS0NWxF" =       { 
         assignmentName = "Information System"; 
         assignmentWeight = 35; 
        }; 
        "-KpIgOGSAwg_VSpDWhWR" =       { 
         assignmentName = "Process Analysis"; 
         assignmentWeight = 30; 
        }; 
        "-KpIgPhu_3Zxw36xt3O4" =       { 
         assignmentName = Labs; 
         assignmentWeight = 10; 
        }; 
        "-KpIgQoFEdRnLlMAq2VN" =       { 
         assignmentName = Exam; 
         assignmentWeight = 20; 
        }; 
       }; 
       paperColor = 22; 
       paperGoal = 95; 
       paperName = "Systems Analysis"; 
      }; 
     }; 
     semesterCode = 17S2; 
     semesterGoal = 90; 
     semesterName = "2017 Semester Two"; 
    }; 
}; 
+0

你能显示数据字典它包含什么? – 3stud1ant3

+0

我用示例更新了我的问题。 – Eli

+0

非常类似于https://stackoverflow.com/questions/31613194/remove-values-from-dictionary-in-ios-swift,但使用Swift的结构 – nathan

回答

0

的解决方案,我已经是映射(迭代)在每个父键和将它的子节点分配给一个变量孩子。然后测试每个子属性(赋值Goal,赋值名等)为“-1”为字符串,-1为整数。如果匹配,则从子女中删除该键:值对。

然后将孩子分配回父节点。

let result: [Any] = dict.map { dictionary in 
    var d = dictionary 
    var child = d.value as Dictionary 

    if let goal = child["assignmentGoal"] as? String, goal == "-1" { 
     child.removeValue(forKey: "assignmentGoal") 
    } 

    if let name = child["assignmentName"] as? String, name == "-1" { 
     child.removeValue(forKey: "assignmentName") 
    } 

    if let result = child["assignmentResult"] as? Int, result == -1 { 
     child.removeValue(forKey: "assignmentResult") 
    } 

    if let weight = child["assignmentWeight"] as? Int, weight == -1 { 
     child.removeValue(forKey: "assignmentWeight") 
    } 

    d.value = child 

    return d 
} 

//show the output 
for item in result { 
    print(item) 
} 

和结果输出

(key: "-KpIgOGSAwg_VSpDWhWR", 
    value: ["assignmentName": "Process Analysis System", "assignmentWeight": 30]) 
(key: "-KpIgQoFEdRnLlMAq2VN", 
    value: ["assignmentName": "Exam", "assignmentWeight": 20]) 
(key: "-KpIgJnFlC6fhgS0NWxF", 
    value: ["assignmentName": "Information System", "assignmentGoal": "3", "assignmentWeight": 35]) 
(key: "-KpIgPhu_3Zxw36xt3O4", 
    value: ["assignmentName": "Labs", "assignmentWeight": 10]) 
(key: "-KpIgH6uN19OpcuedYe1", 
    value: ["assignmentName": "Information System Proposal", "assignmentResult": 100, "assignmentWeight": 5])