如何比较两个对象数组?

我有一个A类:

class A { var identifier: String? var quantity: Int = 0 } 

两个A实例数组:

 var array1: [A] = [a1, a2, a3, a4] var array2: [A] = [a5, a6, a7, a8] 

我不知道检查哪种方法最好: array1==array2 if a1.identifier == a5.identifier, a2.identifier == a6.identifier, a3.identifier==a7.identifier, a4.identifier==a8.identifier在斯威夫特的array1==array2 if a1.identifier == a5.identifier, a2.identifier == a6.identifier, a3.identifier==a7.identifier, a4.identifier==a8.identifier

请帮帮我…

假设您的数据如下:

 struct Person { let name: String let id: Int } var people1 = [ Person(name: "Quang Hà", id: 42), Person(name: "Lý Hải", id: 23), Person(name: "Maria", id: 99) ] var people2 = [ Person(name: "Maria yyy", id: 99), Person(name: "Billy", id: 42), Person(name: "David", id: 23) ] 

这是比较具有id的两个人数组的方法:

 func areArrayPeopleEqual(people1:[Person], people2: [Person]) -> Bool { var array1 = people1 var array2 = people2 // Don't equal size => false if array1.count != array2.count { return false } // sort two arrays array1.sortInPlace() { $0.id > $1.id } array2.sortInPlace() {$0.id > $1.id } // get count of the matched items let result = zip(array1, array2).enumerate().filter() { $1.0.id == $1.1.id }.count if result == array1.count { return true } return false } 

你可以尝试这样:

 let result = zip(array1, array2).enumerate().filter() { $1.0 == $1.1 }.map{$0.0} 

首先,我们将Equatable类扩展为具有DRY代码,而不是2个数组总是具有相同的大小,或者如果至少第一个数组<=而不是第二个数组,则可以使用此解决方案。

请注意您正在使用选项,您可能需要先打开它们。

 class A { var identifier: String? var quantity: Int = 0 init(identifier: String, quantity: Int) { self.identifier = identifier self.quantity = quantity } } let a1: A = A(identifier: "1", quantity: 1) let a2: A = A(identifier: "2", quantity: 2) let a3: A = A(identifier: "3", quantity: 3) let a4: A = A(identifier: "4", quantity: 4) let a5: A = A(identifier: "1", quantity: 1) let a6: A = A(identifier: "2", quantity: 2) let a7: A = A(identifier: "3", quantity: 3) let a8: A = A(identifier: "4", quantity: 4) var array1: [A] = [a1, a2, a3, a4] var array2: [A] = [a5, a6, a7, a8] func areEquals(array1: [A], array2: [A]) -> Bool { if array1.count < array2.count { return false } for i in 0...array2.count - 1 { if array1[i] != array2[i] { return false } } return true } extension A: Equatable { static func ==(lhs: A, rhs: A) -> Bool { //you can choose how and when they should be equals return lhs.identifier == rhs.identifier } } 

工作证明

试试这段代码,让我知道它是否有效

 func toDictionary( array: [E], transformer: (element: E) -> (key: K, value: V)?) -> Dictionary { return array.reduce([:]) { (var dict, e) in if let (key, value) = transformer(element: e) { dict[key] = value } return dict } } 

然后你可以执行如下检查

 let areEqual = array1.count == array2.count; if areEqual { let dict1 = toDictionary(array1) { ($0.identifier, $0.quantity) } let dict2 = toDictionary(array2) { ($0.identifier, $0.quantity) } areEqual = NSDictionary(dictionary: dict1).isEqualToDictionary(dict2) } print(areEqual) 

免责声明:函数toDictionary已在此处形成