如何基于另一个数组元素更新数组的所有对象

时间:2018-11-30 21:01:53

标签: ios arrays swift

假设我有两个对象类型相同的数组,现在我想基于另一个数组的某个键更新第一个数组的所有元素。 I want to update isSelected to true if myArray id ,matches with testArray id。 我可以使用for循环遍历myArray并检查在testArray中发现的每个id,并基于该索引可以更新isSelected值。但是我想知道是否可以针对这种用例使用containsfilter之类的高阶函数。

class MyObject
{
    var id: Int
    var isSelected:Bool?
    var value: String
}

var myArray = [{id: 1, isSelected: nil, value: abcd}, {id: 2, 
isSelected: nil, value: xyz}, {id: 3, isSelected: nil, value: hghghg} ]

var testArray = [{id: 1, isSelected: nil, value: abcd}, {id: 2, 
isSelected: nil, value: xyz}]

let resultArray = [{id: 1, isSelected: true, value: abcd}, {id: 2, 
isSelected: true, value: xyz}, {id: 3, isSelected: nil, value: hghghg}] 

3 个答案:

答案 0 :(得分:0)

您可以尝试

double

它可以是1行,但是我不想在forEach的每个循环中映射ids,因为它会很昂贵

let testArrIds = testArray.map { $0.id }
myArray.forEach { $0.isSelected =  testArrIds.contains($0.id) ? true : $0.isSelected  }

答案 1 :(得分:0)

我对您的类和数组做了一些更改以使代码正常工作

class MyObject: CustomStringConvertible {
    var id: Int
    var isSelected:Bool?
    var value: String

    var description: String {
        return "\(id) \(value) \(isSelected ?? false)"
    }

    init(id: Int, value: String) {
        self.id = id
        self.value = value
    }
}

var myArray = [MyObject(id: 1, value: "abcd"), MyObject(id: 2, value: "xyz"), MyObject(id: 3, value: "hghghg") ]

var testArray = [MyObject(id: 1, value: "abcd"), MyObject(id: 2, value: "xyz")]

testArray.forEach( { myObject in
    if let first = myArray.first(where: { $0.id == myObject.id }) {
        first.isSelected = true
    }
})

print(myArray)
  

[1 abcd是,2 xyz是,3 hghghg是]

答案 2 :(得分:0)

以上解决方案对类对象有效,但不适用于结构,如果有人像我一样专门寻找结构,我们可以按以下方式对结构进行操作。

struct Tag {
    let title: String
    var isSelected: Bool = false
}

let fetched = array of tags fetched from server
let current = array of currently selected tags 

现在我们要从服务器更新标签以使用当前选定的标签进行选择

let updatedTags = fetched.map { fetchedTag in
    var updatedTag = fetchedTag
    if current.map({ $0.title }).contains(updatedTag.title) {
        updatedTag.isSelected = true
    }
    return updatedTag
 }