【问题标题】:Ruby function to get specific item in array and dynamically get nested dataRuby函数获取数组中的特定项目并动态获取嵌套数据
【发布时间】:2017-08-05 11:08:55
【问题描述】:

如果我有一个看起来像这样的哈希数组

array = [{
  name: 'Stan',
  surname: 'Smith',
  address: {
    street: 'Some street',
    postcode: '98877',
    #...
  }
}, {
  #...
}]

您能否编写一个函数来获取数组中的特定项,对其进行迭代并动态检索随后的嵌套数据?

这个例子不起作用,但希望能更好地解释我的问题:

def getDataFromFirstItem(someVal)
  array(0).each{ |k, v| v["#{ someVal }"] }
end

puts getDataFromFirstItem('name')
# Expected output: 'Stan'

对于上下文,我正在尝试创建一个中间人助手,这样我每次在模板中使用它时就不必遍历一个只有一个项目的特定数组。该项目(哈希)包含大量全局站点变量。数据来自 Contentful,其中所有内容都是条目数组。

【问题讨论】:

  • 我不确定我是否理解您的问题。您能否给出预期输出的完整示例?
  • 感谢您的回复...我已经添加了预期的输出。这有帮助吗?如果您需要更多信息,请告诉我。
  • 那么array[0][:name] 做你想做的事吗?
  • 正如@pascalbetz 建议的那样。如果您将密钥作为字符串传递,您可能想做def getDataFromFirstItem(someVal); array.first[someVal.to_sym];end
  • 谢谢。是的,这确实适用于这个例子,但它似乎不适用于中间人的数据,它包含一些“增强”哈希值 (#<Middleman::Util::EnhancedHash item_one=...),这不允许我这样做......无论如何,这显然超出了我的范围和原始问题的范围,所以如果你回答,我会标记你的正确。

标签: ruby middleman


【解决方案1】:

从 ruby​​ 2.3 及更高版本开始,您可以使用 Array#digHash#dig 两者

通过在每一步调用 dig 提取由 idx 对象序列指定的嵌套值,如果任何中间步骤为 nil,则返回 nil

array = [{
  name: 'Stan',
  surname: 'Smith',
  address: {
    street: 'Some Street',
    postcode: '98877'
  }
}, {
}]

array.dig(0, :name)               # => "Stan"
array.dig(0, :address, :postcode) # => "98877"
array.dig(0, :address, :city)     # => nil
array.dig(1, :address, :postcode) # => nil
array.dig(2, :address, :postcode) # => nil

【讨论】:

    【解决方案2】:

    请试试这个

    array = [{
      name: 'Stan',
      surname: 'Smith',
      address: {
        street: 'Some street',
        postcode: '98877',
        #...
        }
      },
      {
        name: 'Nimish',
        surname: 'Gupta',
        address: {
          street: 'Some street',
          postcode: '98877',
          #...
        }
      }
    ]
    
    
    def getDataFromFirstItem(array, someVal)
      array[0][someVal]
    end
    
    #Run this command
    getDataFromFirstItem(array, :name) # => 'Stan'
    
    #Please notice I send name as a symbol instead of string because the hash you declared consists of symbol keys
    
    #Also if you want to make a dynamic program that works on all indexes of an array and not on a specific index then you can try this
    
    def getDataFromItem(array, index, someVal)
      if array[index]
        array[index][someVal]
      end
    end
    
    getDataFromItem(array, 0, :name) # => Stan
    getDataFromItem(array, 1, :name) # => Nimish
    getDataFromItem(array, 2, :name) # => nil
    

    希望这可行,如果您仍然遇到任何问题,请告诉我

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 2017-01-12
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      相关资源
      最近更新 更多