在Ruby中操作嵌套哈希数组的输出

hzbexzde  于 2022-12-26  发布在  Ruby
关注(0)|答案(2)|浏览(130)

我一直在JSON中从API提取数据,目前遇到了一个基本问题
这些数据是关于公司的,比如谷歌和Facebook,并且是一个数组或散列,如下所示:

[
  {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>GOOG, "primary_role"=>"company"}},
  {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>FB, "primary_role"=>"company"}}
]

下面是我想尝试的两种操作:
1.打印出每家公司的名称、ID和股票代码(即"Google-1-GOOG"和"Facebook-2-FB")
1.从Google和Facebook中删除"主要角色"键/值
1.为Google和Facebook分配新的"行业"键/值
有什么想法吗?
我是Ruby的初学者,但是遇到了一些数组和散列的函数/方法(例如未定义的方法)问题,因为这看起来是一个散列数组
谢谢大家!

8e2ybdfx

8e2ybdfx1#

Ruby提供了一些工具来帮助我们理解数组、散列以及两者的嵌套混合。
假设您的数据如下所示(我在GOOGFB周围添加了引号):

data = [
  {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>"GOOG", "primary_role"=>"company"}},
  {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>"FB", "primary_role"=>"company"}}
]

可以使用each迭代数组,例如:

data.each do |result|
   puts result["id"]
end

可以通过以下几种方式挖掘哈希并打印结果:

data.each do |result|
  # method 1
  puts result["properties"]["name"]

  # method 2  
  puts result.dig("properties", "name")
end

方法#1使用hash[key]语法,因为第一个哈希值是另一个哈希值,所以可以将其链接起来以获得所需的结果。这种方法的缺点是,如果某个结果中缺少properties键,则会出现错误。
方法#2使用dig,它接受嵌套的键作为参数(按顺序),它将深入到嵌套的散列中并取出值,但如果缺少任何一步,它将返回nil,如果您处理来自外部源的数据,则nil可能更安全一些

从散列中删除元素

你的第二个问题有点复杂。你有两个选择:
1.从嵌套哈希中删除primary_role键,或者
1.创建一个新对象,其中包含除primary_role键以外的所有数据。
我通常倾向于后者,并建议阅读有关不变性和不可变数据结构的内容。
但是,要实现[1],您可以对密钥执行就地delete操作:

data.each do |company| 
  company["properties"].delete("primary_role")
end

向散列添加元素

您只需使用hash[key] = value即可分配新的哈希值,因此您可以使用以下内容设置行业:

data.each do |company| 
  company["properties"]["industry"] = "Advertising/Privacy Invasion"
end

这会给你留下这样的结果:

[
  {
    "id"=>"1", 
    "properties"=>{
      "name"=>"Google", 
      "stock_symbol"=>"GOOG", 
      "industry"=>"Advertising/Privacy Invasion"
    }
  },
  {
    "id"=>"2", 
    "properties"=>{
      "name"=>"Facebook", 
      "stock_symbol"=>"FB", 
      "industry"=>"Advertising/Privacy Invasion"
    }
  }
]
mf98qq94

mf98qq942#

要实现第一个操作,可以迭代公司数组并访问每个公司的相关信息,下面是Ruby中的一个示例:

companies = [  {"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>"GOOG", "primary_role"=>"company"}},  {"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>"FB", "primary_role"=>"company"}}]

companies.each do |company|
  name = company['properties']['name']
  id = company['id']
  stock_symbol = company['properties']['stock_symbol']
  puts "#{name} - #{id} - #{stock_symbol}"
end

这将打印出每个公司的名称、ID和股票代码。
要删除“主要角色”键/值,可以对属性哈希使用delete方法。例如:

companies.each do |company|
  company['properties'].delete('primary_role')
end

要添加新的“industry”键/值,可以使用[]=运算符将新的键/值对添加到属性散列中。例如:

companies.each do |company|
  company['properties']['industry'] = 'Technology'
end

这将向每个公司的属性散列添加一个新的键/值对,键为“industry”,值为“Technology”。

相关问题