我有一个包含词典数组的词典。
"other":(
{
"grocery_section" = other,
name = test
},
{
"grocery_section" = other,
name = test1
},
{
"grocery_section" = other,
name = test2
}
),
"c0f5d6c5-4366-d310c0c9942c": (
{
"grocery_section" = refrigerated,
name = "Nondairy milk"
},
{
"grocery_section" = other,
name = "test
}
)
现在,我想要的是键和索引,其中name = test 。现在,我正在迭代字典并在其中获取
之类的元素的索引for (key, value) in list {
print(key)
print((value as! [String:String]).indices.filter { (value as! [String:String])[$0]["name"] == "test"})
}
它有效,但我认为它不是有效的方法。因此,需要一种更有效的方法。
主要问题是如何用另一个元素替换或更新该元素。例如,我想在status = "true"
的两个元素中添加name = test
。我也可以通过循环运行或查找元素并替换它来做到这一点。但是我需要一些有效的方法。
答案 0 :(得分:0)
枚举外部词典并使用filter
var filteredDict = [String:[Int]]()
for (key, value) in dict {
let indices = value.indices.filter{ value[$0]["name"] == "test" }
if !indices.isEmpty { filteredDict[key] = indices }
}
结果是[String:[Int]]
字典,键是字典键,值是索引。
对于给定的数据,结果为["c0f5d6c5-4366-d310c0c9942c": [1], "other": [0]]
如果要更新项目,由于值语义的原因,必须指定整个路径
list[key]![index]["propertyName"] = value
答案 1 :(得分:0)
您可以使用flatMap
和compactMap
:
let matches = list.flatMap { key, value in
// go through all elements in the array and convert the matching dictionaries in (key, index) pairs
value.enumerated().compactMap { index, dict in
dict["name"] == "test" ? (key, index) : nil
}
}
print(matches)
示例输出:
[("other", 0), ("c0f5d6c5-4366-d310c0c9942c", 1)]
如果要避免同一密钥重复,可以使用map
代替compactMap
:
let matches = list.map { key, value in
(key, value.enumerated().compactMap { index, dict in
dict["name"] == "test" ? index : nil
})
}
示例输出:
[("other", [0]), ("c0f5d6c5-4366-d310c0c9942c", [1])]
内部compactMap
将仅在名称匹配的项目上构建一个数组,而外部flatMap
将使原本为二维的数组变平。