带条件的map数组

时间:2014-07-10 09:13:37

标签: ruby-on-rails ruby arrays

我有像

这样的数组
 strings = ["by_product[]=1", "by_product[]=2", "page=1", "per_page=10", "select[]=current", "select[]=requested", "select[]=original"]

是来自请求

的参数数组

然后有代码从数组生成哈希

arrays = strings.map do |segment|
        k,v = segment.split("=")
        [k, v && CGI.unescape(v)]
Hash[arrays]

CUrrent输出 -

"by_product[]": "2",
      "page":"1",
      "per_page":"10",
      "select[]":"original"

预期产出 -

"by_product[]":"1, 2",
      "page":"1",
      "per_page":"10",
      "select[]":"current, requested, original"

问题是 - 在split方法之后很少by_product[]而最后一个只是覆盖任何其他参数,所以在结果而不是哈希与数组作为这些参数的值我只得到最后一个。我不知道如何解决它。有任何想法吗?或者至少算法

4 个答案:

答案 0 :(得分:3)

所以试试这个:

hash = {}
arrays = strings.map do |segment|
          k,v = segment.split("=")
          hash[k]||=[]
          hash[k] << v
        end

输出

1.9.3-p547 :025 >   hash
 => {"by_product[]"=>["1", "2"], "page"=>["1"], "per_page"=>["10"], "select[]"=>["current", "requested", "original"]}

或者如果你只想做字符串

arrays = strings.map do |segment|
          k,v = segment.split("=")
          hash[k].nil? ? hash[k] = v : hash[k] << ", " + v
        end

答案 1 :(得分:2)

不要重新发明轮子,CGI和Rack可以处理查询字符串。

假设您的strings数组来自单个查询字符串:

query = "by_product[]=1&by_product[]=2&page=1&per_page=10&select[]=current&select[]=requested&select[]=original"

您可以使用CGI::parse :(所有值都作为数组)

require 'cgi'

CGI.parse(query)
#=> {"by_product[]"=>["1", "2"], "page"=>["1"], "per_page"=>["10"], "select[]"=>["current", "requested", "original"]}

Rack::Utils.parse_query :(需要的数组)

require 'rack'

Rack::Utils.parse_nested_query(query)
# => {"by_product[]"=>["1", "2"], "page"=>"1", "per_page"=>"10", "select[]"=>["current", "requested", "original"]}

Rack::Utils.parse_nested_query :(没有[]后缀的值)

require 'rack'

Rack::Utils.parse_nested_query(query)
# => {"by_product"=>["1", "2"], "page"=>"1", "per_page"=>"10", "select"=>["current", "requested", "original"]}

如果这些是Rails控制器的参数,则可以use params

答案 2 :(得分:1)

这也有效:

strings.inject({}){ |hash, string| 
  key, value = string.split('='); 
  hash[key] = (hash[key]|| []) << value;
  hash;
}

输出: {"by_product[]"=>["1", "2"], "page"=>["1"], "per_page"=>["10"], "select[]"=>["current", "requested", "original"]}

答案 3 :(得分:0)

就这么简单

array.map { |record| record*3 if condition }

record * 3是您在映射时要对数组执行的结果操作