【问题标题】:Get single hash from array从数组中获取单个哈希
【发布时间】: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 问题吗?
  • 我编辑了上面的问题。是的,这最初来自红宝石。也许我得到的是一组对象而不是一组哈希,这就是导致一些头痛的原因?作为旁注,它一遍又一遍地吐出最终的对象/散列,而不是像我想象的那样循环。
  • 该代码中还有许多其他问题。但它们与原始问题无关

标签: arrays ruby hash


【解决方案1】:

select 返回一个包含所有满足条件的元素的数组。试试find,它将返回第一个符合您条件的单个项。

还要确保您的哈希将键作为字符串而不是符号,否则您将无法匹配任何条件。 e[:name]e["name"] 是有区别的。

https://apidock.com/ruby/Array/select

https://apidock.com/ruby/Enumerable/find

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    相关资源
    最近更新 更多