基于多个查询参数相交数组

时间:2012-12-11 00:03:27

标签: ruby arrays sinatra params query-parameters

@data@x@y@z都是相同类型的数组。我在视图中使用@data迭代它并显示所有值。

  @data = if params[:a] == "1"
    @x
  elsif params[:b] == "1"
    @y 
  elsif params[:c] == "1"
    @z

如果应用了多个参数,我想要做的还是与数组相交。因此,例如,如果?a=1&b=2附加到网址,那么我希望@data等于@x & @y

我不确定如何编写这段代码 - 最简单的方法是找出哪些参数== 1然后与相应的数组相交并将其存储在@data中?

2 个答案:

答案 0 :(得分:3)

幸运的是,Ruby让这很容易!

@data = [params[:a] && @x, params[:b] && @y, params[:c] && @z].compact.inject(:&)

这构造了一个数组的数组(如果参数存在;如果你想要更具体,你可以检查== '1')或nils(如果它不存在)。 compact然后从数组中删除nils,然后我们可以通过调用inject(:&)来交叉剩余的值。

inject调用迭代您的值数组,获取第一个值,然后应用&方法,并将下一个值作为参数。然后它接受结果并将&与第三个参数一起使用,依此类推,得到一个最终值,它是传递数组中所有数组的交集。

答案 1 :(得分:1)

这个怎么样?

key_to_array = {:a => @x, :b => @y, :c => @z}

@data = key_to_array.select { |k, _| params[k] == '1' }.values.inject(&:&)

※在Ruby 1.8中不起作用