簡體   English   中英

字典比較數組-swift3

[英]Array of dictionary comparision - 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": "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

這是工作。 但是我想知道實現這一目標的最佳方法。

而不是使用for循環進行比較。 我想使用這樣的過濾器

let arrayC = filteredArray.filter{
        let dict = $0
        return !arr2.contains{ dict == $0 }
    }

如果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")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM