如何浏览Ruby多维列表

如何浏览Ruby多维列表,ruby,Ruby,我如何浏览Ruby提供的如下列表: l = {} l["account-id"] = "123" l["account-id"] = {} l["account-id"]["banana"] = {} l["account-id"]["banana"]["good"] = "true" l["account-id"]["banana"]["bad"] = "false" l["account-id"]["apple"] = {} l["account-id"]["apple"]["good"]

我如何浏览Ruby提供的如下列表:

l = {}
l["account-id"] = "123"
l["account-id"] = {}
l["account-id"]["banana"] = {}
l["account-id"]["banana"]["good"] = "true"
l["account-id"]["banana"]["bad"] = "false"
l["account-id"]["apple"] = {}
l["account-id"]["apple"]["good"] = "false"
l["account-id"]["apple"]["bad"] = "true"
基本上,我想要一双像这样的

"123" "banana" "true" "false"
"123" "apple" "true" "true"

如何得到它?有没有比使用
={}
为每个子集声明更有效的方法来创建此类列表?在我的例子中,有许多不同的
帐户id
,还有像
苹果
香蕉
,但最后一个(
好的
坏的
)是固定的。谢谢。

如果您不生成您认为是因为第三行覆盖了第二行中指定的值而生成的嵌套哈希,请执行以下操作:

l["account-id"] = "123"
l["account-id"] = {}
因此,返回的哈希不再包括帐户id

但无论如何,有一种更简单、更易读的方法来定义散列:

l = {
  '123' => {
    'banana' => {
      'good' => 'true',
      'bad' => 'false'
    },
    'apple' => {
      'good' => 'false',
      'bad' => 'true'
    }
  }
}
要返回预期输出,我将执行以下操作:

l.flat_map { |id, fruits| fruits.map { |name, tastes| [id, name, *tastes.values] } }
#=> [["123", "banana", "true", "false"], ["123", "apple", "false", "true"]]

关于您的数据结构,我需要改进的地方有:good/bad子散列对我来说有点奇怪,因为它不清楚应该如何使用。假设有人输入了
{'good'=>'true','bad'=>'true'}
,这是什么意思。此外,您将
id
(看起来像一个整数)和布尔值存储为字符串。我会使用他们的真实数据类型

l = {
  123 => {
    'banana' => {
      'likes' => true
    },
    'apple' => {
      'likes' => false
    }
  }
}
或者只是:

l = {
  123 => {
    'banana' => true,
    'apple' => false
  }
}

但这取决于数据来自何处,以及您以后需要如何构造数据。

输入不是列表,输出不是“成对的”。请从陈述问题开始。另外,
account\u id
被放在第三行,因此输入数据不一致。