arrays - 在 Ruby 中操作嵌套哈希数组的输出
问题描述
我一直在从 JSON 中的 API 中提取数据,目前正在遇到一个基本问题
数据位于公司(例如 Google 和 Facebook)上,并且位于数组或哈希中,如下所示:
[
{"id"=>"1", "properties"=>{"name"=>"Google", "stock_symbol"=>GOOG, "primary_role"=>"company"}},
{"id"=>"2", "properties"=>{"name"=>"Facebook", "stock_symbol"=>FB, "primary_role"=>"company"}}
]
以下是我想尝试的两个操作:
- 对于每家公司,打印出名称、ID 和股票代码(即“Google - 1 - GOOG”和“Facebook - 2 - FB”)
- 从 Google 和 Facebook 中删除“主要角色”键/值
- 为 Google 和 Facebook 分配新的“行业”键/值
有任何想法吗?
我是 Ruby 的初学者,但在数组和散列的某些函数/方法(例如未定义的方法)方面遇到了问题,因为这看起来是一个散列数组
谢谢!
解决方案
Ruby 提供了一些工具来帮助我们理解数组、散列和两者的嵌套混合。
假设您的数据看起来像这样(我在GOOG
和周围添加了引号FB
):
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
,如果您正在处理来自外部源的数据,这可能会更安全一些
从哈希中删除元素
你的第二个问题涉及更多一点。你有两个选择:
primary_role
从嵌套哈希中删除键,或- 创建一个包含除
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"
}
}
]
推荐阅读
- c# - 将 Windows 应用程序连接到虚拟机中另一台计算机中的 SQL Server 时出现问题
- python - numpy:如何使用矩阵元素作为索引?
- javascript - 为什么这个 js 条件不起作用 - if ( xxx === undefined )
- sql - Oracle SQL 更新 CTE 表
- c++ - 栈顶操作如何升级
- c# - 如何在复杂的嵌套映射中映射 DTO
- javascript - Javascript 原型:获取兄弟姐妹
- entity-framework - 如何创建和填充 DbSet(Of T)?
- android - 任何可用于对讲阅读完成的回调 - Android
- lazy-loading - 带有惰性大小的 Swiper 5