使用define_method在Ruby中生成动态数组名称

时间:2016-08-11 18:17:33

标签: arrays ruby loops

我正在尝试弄清楚如何使用define_method(或任何其他方法)生成数组名称,因为我的方法循环遍历数组并将每个哈希元素转换为JSON。现在,我的数据是一系列哈希数组,只是转储到一个文件中,不包含在任何更大的数组中。

data_arrays = [{"key1":"value1"}, {"key2":"value2"}]
       [{"key3":"value3"}, ("key4":"value4")]
       [{"key5":"value5"}, ("key6":"value6")]

我尝试使用的代码如下所示。基本上,我希望每个哈希数组都转换为JSON并分配一个新名称,如json_array_1,jason_array_2等。

data_arrays.each do |element|
    for (i = 0; i < data_array.length; i+=1) do
        define_method("json_array_#{i}") do
            json_array_[i] = element.to_json
        end
    end
end

我知道这一行:for (i = 0; i < data_array.length; i+=1) do根本不是Ruby或良好的代码。但我需要一种迭代循环的方法,同时也可以将变量“i”插入到json_array名称中。任何人都可以给我任何指针让这个代码工作?我可能会过度思考事情并使其变得比实际更难。

2 个答案:

答案 0 :(得分:1)

data_arrays.each_with_index do |element, i|
  define_method("json_array_#{i}") do
    element.to_json
  end
end

这将定义方法json_array_0json_array_1 ... 如果你想从`json_array_1。

开始,请设为"json_array_#{i + 1}"

答案 1 :(得分:0)

data_arrays = [[{key1:"value1"}, {key2:"value2"}],
               [{key3:"value3"}, {key4:"value4"}],
               [{key5:"value5"}, {key6:"value6"}]]
require 'json'

json_strings = data_arrays.map { |a| a.map { |h| h.to_json } }
  #=> [["{\"key1\":\"value1\"}", "{\"key2\":\"value2\"}"],
  #    ["{\"key3\":\"value3\"}", "{\"key4\":\"value4\"}"],
  #    ["{\"key5\":\"value5\"}", "{\"key6\":\"value6\"}"]]

or

json_strings = data_arrays.flat_map { |a| a.map { |h| h.to_json } }
  #=> ["{\"key1\":\"value1\"}", "{\"key2\":\"value2\"}", "{\"key3\":\"value3\"}", 
  #    "{\"key4\":\"value4\"}", "{\"key5\":\"value5\"}", "{\"key6\":\"value6\"}"] 

depending on your needs.