【问题标题】:Retrieve array with objects of similar property检索具有相似属性的对象的数组
【发布时间】:2017-02-16 17:29:37
【问题描述】:

我的两个对象(Obj1 和 Obj2)定义如下:

class Obj1: NSObject {
   var code : String

   init(code: String) {
     self.code = code
   }
}


class Obj2: NSObject {
   var codeObj : Obj1
   var value : Double

   init(primary: Currency, value: Double) {
     self.primary = primary
     self.value = value
   }
}

我有一个 Obj2 数组,我正在尝试更新数组 [Obj2],使该数组仅包含其 codeObj.code 相等的 Obj2。包括 Equatable 协议会对此有所帮助吗?

我试过这个:

  let filteredArray =  array1.filter( { (c1: Obj2) -> Bool in
                return conversion2.contains(where: { (c2: Obj2) -> Bool in
                    return c1.codeObj.code == c2.codeObj.code;
                })
            }) + array2.filter( { (c2: Obj2) -> Bool in
                return conversion1.contains(where: { (c1: Obj2) -> Bool in
                    return c1.codeObj.code == c2.codeObj.code;
                })
            })

有办法简化吗?

【问题讨论】:

  • 但等于什么?如果乘以 Obj 有相同的代码会发生什么?例如,如果您有多个Obj 和此代码["aaa", "aba", "aaa", "aba", "abc", "xyz", ard"],输出是什么?输出会是["aaa", "aaa", "aba", "aba"] 吗?
  • 而且由于Obj1是一个类,你需要区分相等和相同。
  • [Obj2] in such a way that the array only contains Obj2 whose codeObj.code are equal 等于什么?
  • @mhergon 是的@DanielT 我试图通过查看codeObj.code 是否与[Obj2] 相等来过滤数组@Alexander [Obj2] 将拥有其codeObj.code 等于的Obj2 codeObj.code 的其他元素。像一个排序数组

标签: arrays swift3 filtering


【解决方案1】:

对我来说,唯一的方法是将equatable 添加到这样的对象中:

class Obj1: NSObject {
    var code : String

    init(code: String) {
        self.code = code
    }

    static func ==(lhs: Obj1, rhs: Obj1) -> Bool {
        return lhs.code == rhs.code
    }

}


class Obj2: NSObject {
    var codeObj : Obj1
    var value : Double

    init(obj: Obj1, value: Double) {
        self.codeObj = obj
        self.value = value
    }

    static func ==(lhs: Obj2, rhs: Obj2) -> Bool {
        return lhs.codeObj == rhs.codeObj
    }

}

并过滤等于,例如:

// Test objects
let obj1A = Obj1(code: "aaa")
let obj1B = Obj1(code: "aba")
let obj1C = Obj1(code: "aaa")
let obj1D = Obj1(code: "cca")
let obj1E = Obj1(code: "aba")
let obj1F = Obj1(code: "xca")

let obj2A = Obj2(obj: obj1A, value: 12.0)
let obj2B = Obj2(obj: obj1B, value: 12.0)
let obj2C = Obj2(obj: obj1C, value: 23.0)
let obj2D = Obj2(obj: obj1D, value: 46.0)
let obj2E = Obj2(obj: obj1E, value: 23.0)
let obj2F = Obj2(obj: obj1F, value: 4.0)

var array = [obj2A, obj2B, obj2C, obj2D, obj2E, obj2F]

var onlyEqual = [Obj2]()
for object in array {
    let count = array.filter({ $0 == object }).count
    if count > 1 {
        onlyEqual.append(object)
    }
}

其中onlyEqual 包含:

aaa 
aba
aaa 
aba

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多