获取选定元素的键和索引Swift

时间:2019-01-08 08:54:57

标签: ios swift

我有一个包含词典数组的词典。

"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。我也可以通过循环运行或查找元素并替换它来做到这一点。但是我需要一些有效的方法。

2 个答案:

答案 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)

您可以使用flatMapcompactMap

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将使原本为二维的数组变平。