【问题标题】:Removing array elements when string matches tags当字符串匹配标签时删除数组元素
【发布时间】:2012-03-13 18:54:03
【问题描述】:

如果数组中的值与给定字符串匹配,我会尝试从数组中删除元素。

我有一个包含标签数组的数组。我正在比较标签的名称,以查看它们是否与用户希望从搜索中排除的内容相匹配。如果是这样,我想从主数组中删除该元素,或者可能添加不匹配的元素。

这是我目前所拥有的:

results = Array.new
test = 0
no_tags.each do |no_tag| #an array of tags whose resources are not to be included
  resources.each do |r|
    add_to_array = false
    r.tags.each do |t|
      if t.name.eql? no_tag
        test += 1
        add_to_array = false
      else
        add_to_array = true
      end
    end

    if add_to_array
      results << r
    end
  end
end 

test 变量只是一个用于调试匹配出现次数的变量,它恰好是 763 个资源中的 141 个。但是,当我在运行此块后执行 results.count 时,我应该得到 622 时只得到 732。

为了澄清,如果标签数组包含匹配项,我需要删除资源数组的元素,或者如果未找到匹配项,另一个选项是将资源数组元素包含到新数组中。

这将作为 JSON 返回给浏览器,我需要排除标签与 no_tags 数组的值匹配的资源。

【问题讨论】:

  • 如果一个资源有多个标签,是否包含它的决定基于它的最后一个标签。这可能就是差异的来源。

标签: ruby arrays ruby-on-rails-3


【解决方案1】:

您可以测试名称和 no_tags 的交集。它应该是空的。

results = resources.select do |r|
  (r.tags.map(&:name) & no_tags).empty?
end

【讨论】:

    【解决方案2】:

    @steenslag 给了我一个想法,为我的问题提供了解决方案。

    resources.delete_if do |resource| 
      (resource.tags.map(&:name) & no_tags).present? 
    end
    

    【讨论】:

      【解决方案3】:

      您正在为作为黑名单元素的资源中的每个 tag 递增 test,但您的结果计数正在计算您保留的 resources 的数量.假设每个资源有多个标签,您就多算了。

      如果您的意图是排除至少一个标签与您的黑名单匹配的每个资源对象,则不应在内部循环内将 add_to_array 设置为 true。这是一个更像红宝石的尝试(注意:未经测试)

      results = Array.new
      test = 0
      resources.each do |r|
        # are any tags elements of no_tags?
        if (r.tags & no_tags).blank? # "&": set intersection
          results << r
        else
          test += 1
        end
      end
      

      【讨论】:

        【解决方案4】:

        delete_if 呢?

        resources.delete_if! { |r| (r.tags & no_tags).present? }
        

        【讨论】:

          猜你喜欢
          • 2011-02-04
          • 2014-07-05
          • 1970-01-01
          • 2015-06-23
          • 2019-12-05
          • 1970-01-01
          • 1970-01-01
          • 2020-08-29
          • 2019-01-05
          相关资源
          最近更新 更多