在字典数组中查找键值对

时间:2015-05-23 22:15:55

标签: arrays swift search dictionary

我有两个字典数组。我想通过搜索1)整个字典或2)第二个数组中字典中的键值对来迭代第一个数组。

如果我尝试搜索整个字典,我会收到错误:Cannot find an overload for 'contains' that accepts an argument list of type '(Array<Dictionary<String, String>>, [String : String])'

for var i = 0; i < arrayOne.count; i++ {

    for item in arrayOne {

        if contains(arrayTwo, arrayOne[i]) == nil {

            // Do something

        }
    } 
}

如果我尝试在第二个数组中搜索一个键值对,我会得到:Cannot subscript a value of type 'Array<Dictionary<String, String>>' with an index of type 'String'

for item in arrayOne {

     if contains(arrayTwo, arrayOne["title"]) {

         // Do something

     }
}

我需要能够在第一个字典数组中搜索第二个字典数组中的某些值。我怎么能这样做?

编辑:两个数组都有相同的声明:

var arrayOne : Array<Dictionary<String, String>> = Array()
var arrayTwo : Array<Dictionary<String, String>> = Array()

1 个答案:

答案 0 :(得分:2)

以下作品。您可以遍历每个数组的项目,将它们与另一个数组中的项目进行比较:

for item1 in arrayOne {
    for item2 in arrayTwo {
        if item1 == item2 {
            println("found a dictionary common to both arrays")
        }
    }
}

在两个数组中搜索公共键/值对:

for dict1 in arrayOne {
    for (key, value) in dict1 {
        for dict2 in arrayTwo {
            if dict2[key] == value {
                println("found \(key):\(value) in both arrays")
            }
        }
    }
}

如果您正在搜索特定密钥:

let key = "title"

for dict1 in arrayOne {
    if let value = dict1[key] {
        for dict2 in arrayTwo {
            if dict2[key] == value {
                println("found \(key):\(value) in both arrays")
            }
        }
    }
}

您可以编写自己的arrayContains函数,其中包含您需要的类型:

func arrayContains(array:[[String:String]], value:[String:String]) -> Bool {
    for item in array {
        if item == value {
            return true
        }
    }
    return false
}

然后用它来找到你想要的值:

// Save all of the dictionaries from the first array that aren't in the second array

var newArray:[[String:String]] = []

for item in arrayOne {
    if !arrayContains(arrayTwo, item) {
        newArray.append(item)
    }
}

在数组中搜索特定的键/值对:

func arrayContains(array:[[String:String]], #key: String, #value: String) -> Bool {
    for dict in array {
        if dict[key] == value {
            return true
        }
    }
    return false
}

let result = arrayContains(arrayTwo, key: "title", value: "Alien!")