简体   繁体   English

比较两个 Arrays 并删除重复项 Swift

[英]Compare Two Arrays and Remove Duplicates Swift

I have two arrays and I would like to create a new array that compares the two and removes both instances of duplicates.我有两个 arrays 并且我想创建一个新数组来比较两者并删除两个重复实例。

I have a custom object:我有一个定制的 object:

struct SubService: Identifiable, Hashable, Encodable {
   var id: String = UUID().uuidString
   var name: String
   var charge: String
   var price: Double
}

My two arrays:我的两个 arrays:

let array1: [SubService] = [SubService(name: "Men's Haircut", charge: "service", price: 10), SubService(name: "Fade", charge: "service", price: 10)]

let array2: [SubService] = [SubService(name: "Fade", charge: "service", price: 10)]

Here is the result I'm looking for:这是我正在寻找的结果:

let result: [SubService] = [SubService(name: "Men's Haircut", charge: "service", price: 10)]

I have tried the following but it returns the same array as array1 .我尝试了以下方法,但它返回与array1相同的数组。 I'm assuming because of the id ?我假设是因为id

let filteredArray = Array(Set(array1).subtracting(array2))

print statements:打印语句:

ARRAY 1: [SubService(id: "F9EDBBC0-3786-4718-B6BE-C31F26D6E0F0", name: "Fade", charge: "service", price: 10.0), SubService(id: "D91939DD-C339-4A56-B09D-C19ABA56A48B", name: "Men\'s Haircut", charge: "service", price: 10.0)]

ARRAY 2: [SubService(id: "373CE5F9-ECB0-4572-BD27-8BC71F96163B", name: "Fade", charge: "service", price: 10.0)]

FILTERED ARRAY: [SubService(id: "D91939DD-C339-4A56-B09D-C19ABA56A48B", name: "Men\'s Haircut", charge: "service", price: 10.0), SubService(id: "F9EDBBC0-3786-4718-B6BE-C31F26D6E0F0", name: "Fade", charge: "service", price: 10.0)]

Any help is appreciated:)任何帮助表示赞赏:)

Reuse your items instead of creating new ones for each array declaration.重复使用您的项目,而不是为每个数组声明创建新项目。

let mens = SubService(name: "Men's Haircut", charge: "service", price: 10)
let womens = SubService(name: "Woman's Haircut", charge: "service", price: 10)
let array1 = [mens, womens]
let array2 = [womens]

When you redefine the second item of array1 in let array2 =... , you create a new UUID that makes it different.当您在let array2 =...中重新定义array1的第二项时,您将创建一个新的UUID ,使其与众不同。 You can actually see that in your printed values.您实际上可以在打印的值中看到这一点。

SubService has to conform to protocol Equatable SubService 必须符合 Equatable 协议

struct SubService: Identifiable, Hashable, Encodable, Equatable  {
   var id: String = UUID().uuidString
   var name: String
   var charge: String
   var price: Double
   static func ==(lhs: SubService, rhs: SubService) -> Bool {
      return lhs.name == rhs.name
   }
}


let arrSet = Set(array2)

let filteredArray = array1.filter{ !arrSet.contains($0) }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM