使用Ruby按類別列印陣列元素(避免直接方法。需要深入解釋才能理解)
這里我有todos陣列陣列:
todos = [
["Send invoice", "money"],
["Clean room", "organize"],
["Pay rent", "money"],
["Arrange books", "organize"],
["Pay taxes", "money"],
["Buy groceries", "food"]
]
我應該首先為如下所示的類別構建一個陣列:
[["money", ["Send invoice", "Pay rent", "Pay taxes"]], ...]
預期輸出:
money:
Send invoice
Pay rent
Pay taxes
organize:
Clean room
Arrange books
food:
Buy groceries
這是我的嘗試:
a, b, c = ["money"], ["organize"], ["food"]
for i in todos
if i[1] == "money"
arr = []
a.push(arr.push(i[0])) #=> ["money", ["Send invoice"], ["Pay rent"], ["Pay taxes"]]
elsif i[1] == "organize"
arr = []
b.push(arr.push(i[0])) #=> ["organize", ["Clean room"], ["Arrange books"]]
else
arr = []
c.push(arr.push(i[0])). #=> ["food", ["Buy groceries"]]
end
end
說明:
在我的代碼中,我直接將值分配給了a, b, c = ["money"], ["organize"], ["food"]錯誤的陣列。請告訴我一些有效的方法來獲得預期的輸出。
uj5u.com熱心網友回復:
我會做:
todos = [
["Send invoice", "money"],
["Clean room", "organize"],
["Pay rent", "money"],
["Arrange books", "organize"],
["Pay taxes", "money"],
["Buy groceries", "food"]
]
todos.group_by(&:last).map { |key, values| [key, values.map(&:first)] }
#=> [["money", ["Send invoice", "Pay rent", "Pay taxes"]], ["organize", ["Clean room", "Arrange books"]], ["food", ["Buy groceries"]]]
這是如何運作的?Enumerable#group_by回傳按其Array#last值分組的嵌套陣列,并將回傳一個嵌套哈希結構,如下所示:
{
"money"=>[["Send invoice", "money"], ["Pay rent", "money"], ["Pay taxes", "money"]],
"organize"=>[["Clean room", "organize"], ["Arrange books", "organize"]],
"food"=>[["Buy groceries", "food"]]
}
在方法鏈的下一步中,它Enumerable#map通過回傳一個包含來自 的鍵的陣列和一個僅包含原始值grouped_by的值的嵌套陣列,將每個鍵/值對轉換為最終結構。first例如,它將在其中一次迭代中獲取此輸入并將其轉換為:
{ "organize"=>[["Clean room", "organize"], ["Arrange books", "organize"]] }
# with `key` being "organize", and `values` being the nested arrays on the right
# getting translated into:
#=> ["organize", ["Clean room", "Arrange books"]]
uj5u.com熱心網友回復:
我們可以使用#each_with_object來迭代todos,構建一個哈希,這對于這個任務來說似乎是一個更有用的資料結構。
h = todos.each_with_object({}) do |arr, h|
task, category = arr
h[category] ||= []
h[category] << task
end
# => {"money"=>["Send invoice", "Pay rent", "Pay taxes"],
# "organize"=>["Clean room", "Arrange books"],
# "food"=>["Buy groceries"]}
這樣做相當于:
h = {}
for arr in todos
task = arr.first
category = arr.last
h[category] = [] unless h.has_key? category
h[category].push(task)
end
要將其轉換為陣列陣列...
h.map { |k, v| [k, v] }
# => [["money", ["Send invoice", "Pay rent", "Pay taxes"]],
# ["organize", ["Clean room", "Arrange books"]],
# ["food", ["Buy groceries"]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512614.html
標籤:数组红宝石
下一篇:被破壞的物體還在嗎?
