将原始数组与辅助数组进行比较,如果与原始数组匹配则更改值

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 的回复:)