2014-01-15 62 views
0

我有以下形式的數組:最有效的ruby方法來轉換這個數組?

[\"id\", 545, \"program_name\", \"VILLIANS MARATHON\", \"episode_name\", \"1-Season1:Ep.11\"] 

我需要將其轉換爲下面的形式:

[545, \"VILLIANS MARATHON\", \"1-Season1:Ep.11\"] 

Im做這個問題的方法如下:

#Convert a Active record hash to a 2D array 
def activerecord_hash_to_datatable_array(activerecord_resultset) 
array_of_arrays = Array.new() 
array_of_rs_hashes = activerecord_resultset.to_a.map(&:serializable_hash) 

array_of_rs_hashes.each do |rs| 
# {"id"=>1594, "program_name"=>nil, "episode_name"=>nil} 
rs = rs.flatten 
#[\"id\", 545, \"program_name\", \"MARATHON\", \"episode_name\", \"1-Season1:Ep.11\"]" 
rs_array = Array.new() 
index = 1 
while index < rs.length  
    puts "index = #{index}"  
    puts "\033[0;33m"+"#{rs[index]}"+"\033[0;37m" 
    log_with_yellow("index[#{index}] " + "#{rs[index]}") 
    rs_array << rs[index] 
    index += 2 
end 
array_of_arrays << rs_array 
end 
array_of_arrays 
end 

我在想什麼最有效的方法來實現這一點。

顯然我只需要保留奇怪的元素。但是,Id喜歡避免迭代所有元素並比較每個元素索引。

有沒有辦法通過跳過所有的偶數元素來做到這一點?

感謝

+1

這是沒有二維數組,但單一的數組,看起來像存儲在數組中的JSON對象 – bjhaid

+1

@bjhaid - 他有一個這樣的數組的數組。 – BroiSatse

+0

@BroiSatse它的一個JSON對象,檢查我的答案,你會明白 – bjhaid

回答

0

嘗試:

your_2d_array.map {|a| a.each_slice(2).map {|key, value| value}} 

如果ahve積極支持,你可以把它寫稍微readible:

your_2d_array.map {|a| a.each_slice(2).map(&:second)} 
+0

但我不想在我的代碼中放入幻數。 Id喜歡可擴展的代碼。如果在長度大於6的數組上使用,這將無法正常工作! – banditKing

+0

AH,我明白了,會更新回答 – BroiSatse

2
require 'json' 
arr = JSON.parse("[\"id\", 545, \"program_name\", \"VILLIANS MARATHON\", \"episode_name\", \"1-Season1:Ep.11\"]") 
new_arr = arr.select.with_index { |x,i| i.odd? } 
p new_arr 
# >> [545, "VILLIANS MARATHON", "1-Season1:Ep.11"] 
+0

我認爲這是正確的做法。由於它是一個json,因爲'\',你給定的數組並不是真正的數組。所以你需要JSON化它們來創建一個有效的數組,然後你可以執行select。 – Sam

3

你可以做到以下幾點:

your_array.values_at(*your_array.each_index.select(&:odd?)) 
=> [545, "VILLIANS MARATHON", "1-Season1:Ep.11"] 
1

如果array_of_rs_hashes確實是哈希的數組,你就不能這樣做:

res = array_of_rs_hashes.map(&:values) 
1

是的有:

require 'json' 
Hash[*JSON.parse(s)].values #=> [545, "VILLIANS MARATHON", "1-Season1:Ep.11"] 

其中s = "[\"id\", 545, \"program_name\", \"VILLIANS MARATHON\", \"episode_name\", \"1-Season1:Ep.11\"]"

相關問題