我有像
这样的数组 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[]
而最后一个只是覆盖任何其他参数,所以在结果而不是哈希与数组作为这些参数的值我只得到最后一个。我不知道如何解决它。有任何想法吗?或者至少算法
答案 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是您在映射时要对数组执行的结果操作