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

时间:2016-01-20 19:23:58

标签: arrays swift higher-order-functions

我有一个带有“标签”(40行)的原始数组,其中的对象包含:

tag: String?
selected: Bool? (false)

然后我用原始数组中的“标签”创建一个新数组,让我们说5行。选择的地方是真的。

我现在想要使用匹配的标签在原始数组中更改selected = true。

这是我的赌注:

originalArray = originalArray.filter{ selectedTags.map({ $0.tag }).contains($0.tag) }.forEach({ $0.selected = true})

Cannot invoke 'forEach' with an argument list of type '(@noescape (TagViewModel) throws -> ())'

3 个答案:

答案 0 :(得分:2)

我就是这样做的:

yourOriginalArray.forEach({
    let tempItem = $0
    if yourSelectedArray.contains( { return $0.tag == tempItem.tag } ) {
        $0.selected = true
    }
})

答案 1 :(得分:0)

我更喜欢@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
    }
}

答案 2 :(得分:0)

您可以简单地执行以下操作:

originalArray = originalArray.map({ element in
    let newArrayFiltered = newArray.filter({ $0.tag == element.tag })
    return (newArrayFiltered.count > 0) ? (newArrayFiltered[0]) : (element)
})

虽然我喜欢@breek的回复:)