Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 过滤对象数组以删除在一个或多个属性中具有相同值的对象_Ios_Arrays_Swift_Xcode_Filter - Fatal编程技术网

Ios 过滤对象数组以删除在一个或多个属性中具有相同值的对象

Ios 过滤对象数组以删除在一个或多个属性中具有相同值的对象,ios,arrays,swift,xcode,filter,Ios,Arrays,Swift,Xcode,Filter,我有一个快速的coreData对象数组。对象有三个属性。我想过滤数组以删除其中两个属性具有相同值的对象 对象属性为Object.name、Object.age、Object.id 所有属性都是字符串类型 我想过滤数组以返回一个数组,从而删除object.name和object.age相同的重复情况 这似乎是对我有效的解决方案。也许不是最优雅但足够简单 对象是coreData对象的数组。第二个数组objectsArray是一个空数组,它在嵌套迭代中填充了非年龄/名称重复项 var objects

我有一个快速的coreData对象数组。对象有三个属性。我想过滤数组以删除其中两个属性具有相同值的对象

对象属性为Object.name、Object.age、Object.id

所有属性都是字符串类型


我想过滤数组以返回一个数组,从而删除object.name和object.age相同的重复情况

这似乎是对我有效的解决方案。也许不是最优雅但足够简单

对象是coreData对象的数组。第二个数组objectsArray是一个空数组,它在嵌套迭代中填充了非年龄/名称重复项

var objects = [Object]()
//initialize the above array objects and fill with core data objects
objects = populateObjectsArrayWithCoreDataObjects()
//create a new empty array called objectsArray
var objectsArray = [Object]()
for index in 0..<self.objects.count {
    let object = objects[index]
    var isDuplicate = false
    for index2 in (index + 1)..<self.objects.count {
        let object2 = objects[index2]
        if object.name == object2.name && object.age == object2.age {
            isDuplicate = true
        }
    }
    if isDuplicate == false {
        objectsArray.append(item)
    }
}
objects = objectsArray
var objects=[Object]()
//初始化上述数组对象并填充核心数据对象
objects=populateObjectsArrayWithCoreDataObjects()
//创建一个名为objectsArray的新空数组
var objectsArray=[Object]()

对于0..中的索引,您可以使用一组:

var uniqueValues = Set<String>()
objectsArray = objectsArray.filter{ uniqueValues.insert("\($0.name)|\($0.age)").inserted}
var uniqueValues=Set()
objectsArray=objectsArray.filter{uniqueValues.insert(“\($0.name)\\($0.age)”).inserted}
您还可以通过扩展数组类型来概括该方法以涵盖其他组合:

extension Array
{
   func filterDuplicate<T>(_ keyValue:(Element)->T) -> [Element]
   {
      var uniqueKeys = Set<String>()
      return filter{uniqueKeys.insert("\(keyValue($0))").inserted}
   }
}

objectsArray = objectsArray.filterDuplicate{ ($0.name,$0.age) }
扩展数组
{
func filterDuplicate(ukeyValue:(元素)->T)->[元素]
{
var uniqueKeys=Set()
返回筛选器{uniqueKeys.insert(“\(keyValue($0))”)。inserted}
}
}
objectsArray=objectsArray.filterDuplicate{($0.name,$0.age)}

虽然Alain的解决方案非常好,但这里有一种更快捷的方法,它得益于KeyPaths:

extension Array {
    func filterDuplicates(by keyPath: PartialKeyPath<Element>) -> Self {
        var uniqueKeys = Set<String>()

        return self.filter { uniqueKeys.insert("\($0[keyPath: keyPath])").inserted }
    }
}
使用方法如下:


yourArr.filterDuplicates(by:\YourClass.propertyOneName,\YourClass.propertyWoName)

你的意思是你想要
(姓名:Abc,年龄:20)
(姓名:Abc,年龄:20)
中的一个对象,对吗?是的,没错。我想要其中一个具有相同名称和年龄的对象。请参考此内容,我不确定如何在coreData对象的链接中应用该解决方案,非常感谢。这是我一直在寻找的优雅解决方案。你救了我的命
extension Array {
    func withRemovedDuplicates(by keyPaths: PartialKeyPath<Element>...) -> Self {
        var uniqueKeys = Set<String>()
        
        return self.filter { element in
            uniqueKeys.insert(keyPaths.map { "\(element[keyPath: $0])" }.joined()).inserted
        }
    }
}