2016-02-23 19 views
0

我有一個數組:裹在嵌套陣列周圍字符串的HREF鏈接

[["val1", ["The cat", "3"]], ["val2", ["Big", "Another", "6"]], ["val3", ["343"]] 

通過使用此代碼從我的質詢時here修改另一個陣列製成:

array.group_by(&:first).map{|k, a| [k, a.map(&:last)]} 

這個問題的答案問題可能會添加到上面的代碼中,或者只是使用給定的數組。

我試圖把陣列到該:

[["val1", ["<a href='/guides/{#guide}/pages/the-cat'>The cat</a>", "<a href='/guides/{#guide}/pages/red-foo'>Red Foo</a>"]], ["val2", [""<a href='/guides/{#guide}/pages/big'>Big</a>", ""<a href='/guides/{#guide}/pages/another'>Another</a>", ""<a href='/guides/{#guide}/pages/6'>6</a>"]], ["val3", [""<a href='/guides/{#guide}/pages/joe'>Joe</a>"]] 

鏈路圍繞陣列數組值包裹。

"<a href='/guides/{#guide}/pages/" + value_parameterized + "'>" + original_value + "</a>" 
  • 它以一個字符串,它構成了a標籤的開始。
  • 然後複製該值並調用parameterize並將其放在第一個字符串之後。
  • 添加另一個字符串。
  • 然後添加數組的原始字符串(或值)。
  • 最後添加a標記的結尾。

複製該值並對其進行參數化,然後將其傳回正確的位置是我沒有希望的地方。

最後,我會打開嵌套數組轉換爲字符串,像這樣:

["val1", "<a href='/guides/{#guide}/pages/the-cat'>The cat</a>, <a href='/guides/{#guide}/pages/red-foo'>Red Foo</a>"] 

如果它更容易修改或創建一個新的陣列和具有第二值是一個字符串,然後我會超級開心。

我不能使用Rails的link_to

+2

在哪裏 「紅富」 和 「喬」 是從哪裏來的?我沒有看到在原始數組中。 – Damon

+0

我改變了值以更好地顯示'.parameterize'。並縮短它,以便在最終結果示例中不會使用href鏈接。它仍然是相同的'類型'我可能應該說 – Rob

回答

2

猜解方法是,

array = [["val1", ["The cat", "3"]], ["val2", ["Big", "Another", "6"]], ["val3", ["343"]] 
array.each_with_object([]) do |val, out| 
    result = [val.first] 
    result << val.second.each_with_object([]) { |v, s_out| s_out << "<a href='/guides/{#guide}/pages/#{v.parameterize}'>#{v}</a>" } 
    out << result 
end 

# => [["val1", ["<a href='/guides/{#guide}/pages/the-cat'>The cat</a>", "<a href='/guides/{#guide}/pages/3'>3</a>"]], ["val2", ["<a href='/guides/{#guide}/pages/big'>Big</a>", "<a href='/guides/{#guide}/pages/another'>Another</a>", "<a href='/guides/{#guide}/pages/6'>6</a>"]], ["val3", ["<a href='/guides/{#guide}/pages/343'>343</a>"]]] 

一個襯裏,

array.each_with_object([]) { |val, out| out << [val.first, val.second.each_with_object([]) { |v, s_out| s_out << "<a href='/guides/{#guide}/pages/#{v.parameterize}'>#{v}</a>" } ] } 

OR

Ruby#each_with_object,創建新的數組。

要改變同一個陣列,可以使用Ruby#map!Ruby#collect!

array = [["val1", ["The cat", "3"]], ["val2", ["Big", "Another", "6"]], ["val3", ["343"]]] 
array.collect! { |value| [value.first, value.second.collect! {|link| "<a href='/guides/{#guide}/pages/#{link.parameterize}'>#{link}</a>" } ] } 

#=> [["val1", ["<a href='/guides/{#guide}/pages/the-cat'>The cat</a>", "<a href='/guides/{#guide}/pages/3'>3</a>"]], ["val2", ["<a href='/guides/{#guide}/pages/big'>Big</a>", "<a href='/guides/{#guide}/pages/another'>Another</a>", "<a href='/guides/{#guide}/pages/6'>6</a>"]], ["val3", ["<a href='/guides/{#guide}/pages/343'>343</a>"]]] 

基準測試結果

    user  system  total  real 
each_with_object 0.000000 0.000000 0.000000 ( 0.000610) 
collect!   0.000000 0.000000 0.000000 ( 0.000379) 
+0

偉大的答案!我在第一個選項中使用了一個班輪。你推薦一個還是認爲一個比另一個更快? – Rob

+1

您應該明顯使用第二個選項。蒐集!使用相同的數組。檢查更新爲答案的基準測試結果。 – BinaryMee