【问题标题】:Compare original array with a secondary array and change value if matched with original array将原始数组与辅助数组进行比较,如果与原始数组匹配则更改值
【发布时间】:2016-01-20 19:23:57
【问题描述】:

我有一个带有“标签”(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 -> ())'

【问题讨论】:

    标签: arrays swift higher-order-functions


    【解决方案1】:

    这就是我的做法:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你可以简单地做这样的事情:

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

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

        【讨论】:

          猜你喜欢
          • 2020-12-01
          • 2017-12-02
          • 1970-01-01
          • 2014-03-29
          • 1970-01-01
          • 2021-01-18
          • 1970-01-01
          • 1970-01-01
          • 2019-08-11
          相关资源
          最近更新 更多