快速从对象数组中删除对象

时间:2017-06-07 18:50:01

标签: ios arrays swift object

我遇到了问题,需要你的帮助。 我有对象数组

var arrayDirection: [Directions]

每个对象都有属性:

var name: String?
var uniqueId: Int?

我需要找到并只留下一个对象,其属性值与该数组中另一个对象的属性值重复。

例如我在控制台中打印:

for object in arrayDirection {
    print(object.name, object.uniqueId)
}

并看到:

  

可选(" name1")可选(833)

     

可选(" name1")可选(833)

     

可选(" name2")可选(833)

     

可选(" name4")可选(833)

     

可选(" name1")可选(833)

     

可选(" name1")可选(862)

所以,我需要删除Optional("name1") Optional(833),因为数组中有3个并且只留下一个我希望看到的结果:

  

可选(" name1")可选(833)

     

可选(" name2")可选(833)

     

可选(" name3")可选(833)

     

可选(" name1")可选(862)

2 个答案:

答案 0 :(得分:1)

实际上您需要从数据集中删除重复项。 This link将帮助您实现目标。

但简而言之,请使用设置以避免重复数据。

答案 1 :(得分:0)

你可以reduce数组:

let reducedArray: [Direction] = myArray.reduce([]) { result, direction in
   result.contains(where: { $0.uniqueId == direction.uniqueId }) ? result : result + [direction]
}

显然,这段代码假设您只想检查ID是否重复,如果要检查整个对象是否重复,您可以为Equatable类型实现Directions协议,或者这样做:

let reducedArray: [Direction] = myArray.reduce([]) { result, direction in
   result.contains(where: { $0.uniqueId == direction.uniqueId && $0.name == direction.name }) ? result : result + [direction]
}

实施Equatable协议实际上非常简单:

let reducedArray: [Direction] = myArray.reduce([]) { result, direction in
   result.contains(where: { $0 == direction }) ? result : result + [direction]
}