从数组中获取单个哈希
Get single hash from array
我有一个哈希数组:
[<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
select
returns 一个包含所有满足条件的元素的数组。尝试 find
,这将 return 第一个 单个 符合您条件的项目。
还要确保您的散列具有字符串形式的键而不是符号,否则您将无法匹配您的任何条件。 e[:name]
和e["name"]
是有区别的。
我有一个哈希数组:
[<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
select
returns 一个包含所有满足条件的元素的数组。尝试 find
,这将 return 第一个 单个 符合您条件的项目。
还要确保您的散列具有字符串形式的键而不是符号,否则您将无法匹配您的任何条件。 e[:name]
和e["name"]
是有区别的。