Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 字典比较数组-swift3_Ios_Arrays_Dictionary_Predicate_Swift3.2 - Fatal编程技术网

Ios 字典比较数组-swift3

Ios 字典比较数组-swift3,ios,arrays,dictionary,predicate,swift3.2,Ios,Arrays,Dictionary,Predicate,Swift3.2,我有两套字典。我想写一个函数来比较这两个数组。 仅当主数组包含子数组元素时,函数才应返回true。 否则它应该返回false 这是我的逻辑- let mainArry = [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 3, "name": "B", "price": "$1"]], ["id":"2","products":["pid": 14, "name

我有两套字典。我想写一个函数来比较这两个数组。 仅当主数组包含子数组元素时,函数才应返回true。 否则它应该返回false

这是我的逻辑-

let mainArry = [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 3, "name": "B", "price": "$1"]], ["id":"2","products":["pid": 14, "name": "C", "price": "$15"]]]

let array1 = [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 3, "name": "B", "price": "$1"]]]

let array2 =  [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 4, "name": "B", "price": "$1"]]]

func compareDictionary(mainArry:[[String: Any]], arr2: [[String: Any]])-> Bool{
    let itemsId = arr2.map { $0["id"]! } // 1, 3, 14

    let filterPredicate = NSPredicate(format: "id IN %@", itemsId)

    let filteredArray = mainArry.filter{filterPredicate.evaluate(with:$0) }

    if filteredArray.count != arr2.count {
        return false
    }
    for obj in filteredArray {
        let prd = obj as Dictionary<String, Any>
        let str = prd["id"] as! String
        let searchPredicate = NSPredicate(format: "id == %@", str )

        let filteredArr = arr2.filter{searchPredicate.evaluate(with:$0) }

        if filteredArr.isEmpty {
            return false
        }

        if !NSDictionary(dictionary: obj["products"] as! Dictionary<String, Any>).isEqual(to: filteredArr.last!["products"] as! [String : Any]) {
            return false
        }

    }
    return true

}

let result1 = compareDictionary(mainArry: mainArry, arr2: array1)
let result2 = compareDictionary(mainArry: mainArry, arr2: array2)

print("Result1 = \(result1)")  // true
print("Result2 = \(result2)")  //false
如果arrayC为空,则表示两个数组相等。

我终于得到了它! 我们不需要编写大函数

let mainArry = [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 3, "name": "B", "price": "$1"]], ["id":"2","products":["pid": 14, "name": "C", "price": "$15"]]]

let array1 = [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 3, "name": "B", "price": "$1"]]]

let array2 =  [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 4, "name": "B", "price": "$1"]]]

let result = array2.filter{
    let dict = $0
    return !mainArry.contains{
        return NSDictionary(dictionary: dict).isEqual(to: $0)
    }
}

if result.isEmpty {
    print("Same key values")
} else {
    print("Diff key values")
}

Code review StackExchange站点是一个更好的地方,可以询问有关代码是否正常工作的问题。我强烈建议将字典解析为更强类型的结构或类,然后使这些对象符合Equatable。我无法在此处直接使用filter函数进行比较。
let mainArry = [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 3, "name": "B", "price": "$1"]], ["id":"2","products":["pid": 14, "name": "C", "price": "$15"]]]

let array1 = [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 3, "name": "B", "price": "$1"]]]

let array2 =  [ ["id":"1","products":["pid": 1, "name": "A", "price": "$5"]], ["id":"3","products":["pid": 4, "name": "B", "price": "$1"]]]

let result = array2.filter{
    let dict = $0
    return !mainArry.contains{
        return NSDictionary(dictionary: dict).isEqual(to: $0)
    }
}

if result.isEmpty {
    print("Same key values")
} else {
    print("Diff key values")
}