【发布时间】:2021-07-16 06:27:03
【问题描述】:
我有一个哈希数组:
[<name: bob, age: 25, orders: 3>, <name: george, age: 21, orders: 2>, <name: sandy, age: 23, orders: 5>, <name: sandy, age: 21, orders: 4>]
我想要一个根据两个条目挑选出单个哈希的函数。即我输入了 name="sandy" age=21。它会返回一个简单的哈希
我试过Array.select {|e| e["name"] == "sandy" and e["age"] == 21}
出于某种原因,我取回了整个数组。
在上面我试图隔离有问题的代码。我似乎仍然有问题,所以下面的完整代码。我在调试方面做了很多来回。其中一些代码可能仍然令人反感......
@budgets = Budget.all
@budgetArray = @budgets.to_a
@actuals = GeneralLedger.select("account_id, entryDate, sum(amount), CASE WHEN MONTH(entryDate) >= 4 THEN concat(YEAR(entryDate), '') ELSE concat(YEAR(entryDate)-1, '') END as fiscalY").group('account_id, fiscalY').order('account_id').to_a
@currentYear = 2021
@numGLYears=2
#@numGLYears = GeneralLedger.select('count(distinct CASE WHEN MONTH(entryDate) >= 4 THEN concat(YEAR(entryDate), '') ELSE concat(YEAR(entryDate)-1, '') END) as fiscalY FROM general_ledgers').to_s.to_i
@budgetTable = Array.new
budgetRow = Array.new
@budgetArray.each do |b|
budgetRow.clear
i=@numGLYears
#budgetRow.push b.account_id
while i >= 1
budgetRow.push getBudget(@budgetArray, @currentYear-i, b.account_id)
budgetRow.push getActuals(@actuals, @currentYear-i, b.account_id)
i=i-1
end
@budgetTable.push budgetRow
end
end
def getBudget(myArray, year, account)
rtn = myArray.select{ |e| (e["year"] == year.to_s) and (e["account_id"] == account.to_s)}
if rtn.nil?
return '-'
else
return rtn
end
#get budget if there else '-'
end
def getActuals(myArray, year, account)
rtn = myArray.find{ |e| e["year"] == year.to_s and e["account_id"] == account.to_s}
if rtn.nil?
return '********************' + year.to_s + account.to_s
else
return rtn
end
end
【问题讨论】:
-
1) 您的代码对哈希输入起作用。只需在选择器之后调用
.first。 2) 输入是散列数组还是对象数组?该语法表明后者。 3)Array是一个类还是数组的变量赋值?无论哪种方式都令人困惑 4) 这是一个 Rails 问题吗? -
我编辑了上面的问题。是的,这最初来自红宝石。也许我得到的是一组对象而不是一组哈希,这就是导致一些头痛的原因?作为旁注,它一遍又一遍地吐出最终的对象/散列,而不是像我想象的那样循环。
-
该代码中还有许多其他问题。但它们与原始问题无关