【问题标题】:What's an easier way to break down this array?有什么更简单的方法来分解这个数组?
【发布时间】:2017-09-14 18:53:58
【问题描述】:

我有一个随机顺序的两个值的数组。 我想找出另一个值是什么,然后把它变成一个字符串。

这是我目前在 Ruby 中的内容,但我正在尝试对其进行清理并使其更简洁。

 array = ["garden_shop","some_value"]
 tag = array.delete("garden_shop")
 @tag = tag.first

这应该导致:

@tag = "some_value"

【问题讨论】:

  • 如果你说array.delete而不是检查array的值,它将被修改。但是,如果您按照某些答案的建议使用 -find,您将获得一个新数组,而原始数组不会被修改。
  • @maxple:original revision 中的示例未修改结构
  • @user000001 它还有delete
  • @maxple:没错,我应该说它没有修改 event_payload。我将 tag_load 变量读为临时变量。不过,您指出差异的第一条评论仍然有用,以防 OP(或其他任何人)没有看到差异。
  • 请阅读“How to Ask”和“minimal reproducible example”以及链接页面。你的问题不清楚。请重读一遍,想象一位同事递给你一张纸,上面印有你的问题,然后走开了。你能回答这个问题吗?你想知道什么?重要的是,需要回答的所有信息都在问题中。当您因评论而澄清问题时,请通过修改信息并将信息添加到您最初放置的位置来将信息放入问题中。不要使用“编辑”或“更新”标签,因为我们可以看到发生了什么变化。

标签: ruby-on-rails ruby


【解决方案1】:

使用- 运算符:

@tag = (array - ["garden_shop"]).first

来源:https://ruby-doc.org/core-2.2.0/Array.html#method-i-2D
相关:How can I delete one element from an array by value

【讨论】:

    【解决方案2】:

    看来find 正是你想要的:

    array.find {|v| v != 'garden_shop'}
    #=> "some_value"
    

    【讨论】:

      【解决方案3】:

      我会使用:

      if array.first == 'garden_shop' 
        array.last 
      else
        array.first 
      end
      # => "some_value"
      

      这也可以更简洁地写成:

      array.first == 'garden_shop' ? array.last : array.first
      # => "some_value"
      

      但它牺牲了可读性。

      这可能会有所帮助:

      array = ["garden_shop","some_value"]
      compare do
        user000001 { (array - ["garden_shop"]).first }
        ilya { array.find {|v| v != 'garden_shop'} }
        ttm {
          if array.first == 'garden_shop' 
            array.last 
          else
            array.first 
          end
        }
      end
      
      # >> Running each test 32768 times. Test will take about 2 seconds.
      # >> ttm is faster than ilya by 5x ± 1.0
      # >> ilya is similar to user000001
      

      而且,只是为了彻底:

      compare do
        ttm1 { array.first == 'garden_shop' ? array.last : array.first }
        ttm2 {
          if array.first == 'garden_shop' 
            array.last 
          else
            array.first 
          end
        }
      end
      # >> Running each test 32768 times. Test will take about 1 second.
      # >> ttm1 is similar to ttm2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-13
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多