【问题标题】:Remove All Items from NSDictionary/Dictionary where value == -1.0从 NSDictionary/Dictionary 中删除所有项目,其中 value == -1.0
【发布时间】:2017-08-26 03:06:55
【问题描述】:

我正在将我的数据从一种格式迁移到另一种格式,以便对我的一个 iOS 应用进行大规模更新。这意味着当用户更新他们的应用程序时,它会将他们的数据迁移到新位置。这个新位置有更严格的规则并使用正确的做法(基本上,当我第一次创建应用程序时,我是一个菜鸟,目前数据库中有一些不好的做法,这个新位置仅用于良好的数据)。

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

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

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

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

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

   print(foundItems)
}

计划然后循环遍历找到的 items 数组并从包含它的数据字典中删除任何键。

这是数据字典的样子:

"-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";
    };
};

【问题讨论】:

标签: swift dictionary firebase nsdictionary


【解决方案1】:

我的解决方案是映射(迭代)每个父键并将其子节点分配给变量child。然后测试每个子属性(assignmentGoal、assignmentName 等)是否为字符串的“-1”和整数的 -1。如果匹配,则从 child 中删除该 key: value 对。

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

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])

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2012-03-11
    • 1970-01-01
    • 2020-05-29
    • 2010-12-04
    相关资源
    最近更新 更多