仅显示ruby哈希值

时间:2017-08-07 15:01:09

标签: ruby

我有一组事件对象。每个事件都有一个名为location的哈希,其中包含名称,地址,州,城市,邮政编码等密钥。但是并非所有位置都有这些键。我只想显示键的值,如果它们在那里。这是我的代码

@events.each do |event|
  if !event.location.empty?
    puts "Location: #{event.location[:name]}, #{event.location[:address]}, #{event.location[:city]}, #{event.location[:state]}, #{event.location[:zipcode]}"
  end 
end 

如果我有一个完整的地址,这可以正常工作。但是,如果我只有它所显示的位置的名称

Location: Central Park, , , ,

如何摆脱那些多余的逗号?有时它可能是2或3个尾随逗号。我知道如何摆脱一个,但如果没有设置尾随逗号的数量,我不知道该怎么做。希望将位置信息显示在一行上。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:5)

我会做这样的事情:

@events.each do |event|
  values = event.location.values_at(:name, :address, :city, :state, :zipcode).compact
  puts "Location: #{values.join(', ')}" unless values.empty?
end 

或者您可能想要在Event课程中添加方法。

def stringified_location
  values = location.values_at(:name, :address, :city, :state, :zipcode).compact
  values.join(', ') unless values.empty?
end

并称之为:

@events.each do |event|
  stringified_location = event.stringified_location
  puts "Location: #{stringified_location}") if stringified_location
end

答案 1 :(得分:0)

您可以使用public signup(request: Hapi.Request, reply: Hapi.Base_Reply) { this.database.user.create(request.payload).then((user: any) => { return reply({ "success": true }); }).catch((err) => { reply(Boom.conflict('User with the given details already exists')); }); } 获取哈希值,然后使用.values将其合并为具有相应分隔符的字符串:

.join(", ")

答案 2 :(得分:0)

您可以使用值创建一个数组,然后将它们连接起来:

@events.each do |event|
  if !event.location.empty?
    puts "Location: #{[event.location[:name], event.location[:address], event.location[:city]}, event.location[:state], event.location[:zipcode]].compact.join(', ')}"
  end 
end 

答案 3 :(得分:0)

一种可能性就是将值放在数组中然后加入它们。

@events.each do |event|
  if !event.location.empty?
    location = [event.location[:name], event.location[:address], event.location[:city], event.location[:state], event.location[:zipcode]]
    location -= [nil] #remove empty elements
    puts "Location: #{location.join(', ')}"
  end 
end