[英]Ruby - how to add an array to a hash key?
我有这个循环:
car_data = Hash.new
Car.all.each do |c|
car_data[c.brand] = c.id
car_data['NEW'] << c.id if c.new == 1
end
我有这个侦听器,试图将所有新车保存到car_data['NEW']
,但是此代码仅在哈希中保留一项(应该为8)。
我还尝试将car_data['NEW']
定义为数组:
car_data = Hash.new
car_data['NEW'] = Hash.new
Car.all.each do |c|
car_data[c.brand] = c.id
car_data['NEW'] << c.id if c.new == 1
end
但是结果是一样的-仅一项。 如何将整个数组保存到哈希键元素?
谢谢。
您写道,您试图将car_data['NEW']
定义(初始化)为数组,但是您所做的是...将其初始化为哈希。
更改:
car_data['NEW'] = Hash.new
至:
car_data['NEW'] = []
完整的代码如下所示:
car_data = Hash.new
car_data['NEW'] = []
Car.all.each do |c|
car_data[c.brand] = c.id
car_data['NEW'] << c.id if c.new == 1
end
car_data['NEW']
必须声明为Array
。
car_data = Hash.new
car_data['NEW'] = []
Car.all.each do |c|
car_data[c.brand] = c.id
car_data['NEW'] << c.id if c.new == 1
end
您也可以一步一步完成
car_data = { new: [] }
Car.all.each do |c|
car_data[c.brand] = c.id
car_data[:new] << c.id if c.new == 1
end
坦白说,以这种方式使用Hash对我来说似乎有些奇怪。 特别是,在Hash中混合不同种类的信息是从其他非面向对象的语言继承的非常糟糕的方法。
我至少要使用两个单独的变量。 但是我对上下文了解不足,无法提供有意义的示例。
car_data = Car.all.each_with_object(Hash.new { |h, k| h[k] = [] }) do |c, memo|
memo[c.brand] = c.id
memo['NEW'] << c.id if c.new == 1
end
或者,更简单地说,让我们根据需要即时创建它:
car_data = Car.all.each_with_object({}) do |c, memo|
memo[c.brand] = c.id
(memo['NEW'] ||= []) << c.id if c.new == 1
end
如果在任何情况下都存在NEW
密钥,也请参考下面@tadman的评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.