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