将原始数组与辅助数组进行比较,如果与原始数组匹配则更改值
Compare original array with a secondary array and change value if matched with original array
我有一个包含 "tags"(40 行)的原始数组,其对象包含:
tag: String?
selected: Bool? (false)
然后我用 "tags" 从原始数组创建一个新数组,假设有 5 行。选择的地方为真。
我现在想用匹配的标签更改原始数组中的 selected = true。
这是我的赌注:
originalArray = originalArray.filter{ selectedTags.map({ [=11=].tag }).contains([=11=].tag) }.forEach({ [=11=].selected = true})
Cannot invoke 'forEach' with an argument list of type '(@noescape (TagViewModel) throws -> ())'
我是这样做的:
yourOriginalArray.forEach({
let tempItem = [=10=]
if yourSelectedArray.contains( { return [=10=].tag == tempItem.tag } ) {
[=10=].selected = true
}
})
我更喜欢@Breek 的回答,他在我还在输入我的回答时发帖了,但无论如何它都在这里了!你可以这样做:
struct TagViewModel : Equatable {
var tag: String
var selected: Bool
init(tag: String, selected: Bool) {
self.tag = tag
self.selected = selected
}
}
func ==(lhs: TagViewModel, rhs: TagViewModel) -> Bool {
return lhs.tag == rhs.tag
}
var originalArray = [
TagViewModel(tag: "1", selected: false),
TagViewModel(tag: "2", selected: false),
TagViewModel(tag: "3", selected: false),
TagViewModel(tag: "4", selected: false),
TagViewModel(tag: "5", selected: false),
TagViewModel(tag: "6", selected: true),
TagViewModel(tag: "7", selected: false),
TagViewModel(tag: "8", selected: true),
TagViewModel(tag: "9", selected: false)
]
let newArray = [
TagViewModel(tag: "1", selected: true),
TagViewModel(tag: "2", selected: true),
TagViewModel(tag: "3", selected: true)
]
for tagViewModel in newArray {
if let index = originalArray.indexOf(tagViewModel) {
originalArray[index].selected = tagViewModel.selected
}
}
您可以简单地执行以下操作:
originalArray = originalArray.map({ element in
let newArrayFiltered = newArray.filter({ [=10=].tag == element.tag })
return (newArrayFiltered.count > 0) ? (newArrayFiltered[0]) : (element)
})
虽然我喜欢@breek 的回复:)
我有一个包含 "tags"(40 行)的原始数组,其对象包含:
tag: String?
selected: Bool? (false)
然后我用 "tags" 从原始数组创建一个新数组,假设有 5 行。选择的地方为真。
我现在想用匹配的标签更改原始数组中的 selected = true。
这是我的赌注:
originalArray = originalArray.filter{ selectedTags.map({ [=11=].tag }).contains([=11=].tag) }.forEach({ [=11=].selected = true})
Cannot invoke 'forEach' with an argument list of type '(@noescape (TagViewModel) throws -> ())'
我是这样做的:
yourOriginalArray.forEach({
let tempItem = [=10=]
if yourSelectedArray.contains( { return [=10=].tag == tempItem.tag } ) {
[=10=].selected = true
}
})
我更喜欢@Breek 的回答,他在我还在输入我的回答时发帖了,但无论如何它都在这里了!你可以这样做:
struct TagViewModel : Equatable {
var tag: String
var selected: Bool
init(tag: String, selected: Bool) {
self.tag = tag
self.selected = selected
}
}
func ==(lhs: TagViewModel, rhs: TagViewModel) -> Bool {
return lhs.tag == rhs.tag
}
var originalArray = [
TagViewModel(tag: "1", selected: false),
TagViewModel(tag: "2", selected: false),
TagViewModel(tag: "3", selected: false),
TagViewModel(tag: "4", selected: false),
TagViewModel(tag: "5", selected: false),
TagViewModel(tag: "6", selected: true),
TagViewModel(tag: "7", selected: false),
TagViewModel(tag: "8", selected: true),
TagViewModel(tag: "9", selected: false)
]
let newArray = [
TagViewModel(tag: "1", selected: true),
TagViewModel(tag: "2", selected: true),
TagViewModel(tag: "3", selected: true)
]
for tagViewModel in newArray {
if let index = originalArray.indexOf(tagViewModel) {
originalArray[index].selected = tagViewModel.selected
}
}
您可以简单地执行以下操作:
originalArray = originalArray.map({ element in
let newArrayFiltered = newArray.filter({ [=10=].tag == element.tag })
return (newArrayFiltered.count > 0) ? (newArrayFiltered[0]) : (element)
})
虽然我喜欢@breek 的回复:)