@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中?
答案 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中不起作用