在哈希中添加或插入数组

时间:2016-11-16 03:50:34

标签: ruby-on-rails ruby

我有一个名为data的哈希,其密钥名为checks,是一个日期数组。如果密钥存在,我想附加到现有数组。如果密钥不存在,我需要添加一个包含当前日期的数组。 在ruby中有优雅的方法吗?

这就是我现在正在做的事情,这似乎比它应该更难:

if data.has_key?('checks')
  data['checks'] << DateTime.now
else
  data['checks'] = Array.wrap(DateTime.now)
end

6 个答案:

答案 0 :(得分:4)

通常我会像这样攻击它:

checks = data['checks'] ||= [ ]
checks << DateTime.now

如果您的data哈希只有类似数组的值,请执行以下操作:

data = Hash.new { |h,k| h[k] = [ ] }

然后你不需要为||=事情烦恼,因为任务会自动发生。

答案 1 :(得分:1)

我不确定它是否优雅,但你可以这样做:

data['checks'] = [*data['checks']] << DateTime.now

基本上,如果数据['checks']为nil,则splat会将其缩减为[],但如果它有条目,则会缩减为具有相同条目的数组。

编辑这是其他人没有提及的另一种选择:

data['checks'] = (data['checks'] || []) << DateTime.now

EDIT2 不使用(可能令人困惑的)splat运算符:

data['checks'] = Array(data['checks']) << DateTime.now

答案 2 :(得分:1)

data['checks'] = data.fetch('checks', []) << DateTime.now

哈希#fetch获取一个键,如果缺少键,则返回一个值。也许比散布到数组文字中更优雅。

答案 3 :(得分:0)

if data.key?('checks')
  data['checks'] << DateTime.now
else 
  data['checks'] = [DateTime.now]
end

答案 4 :(得分:0)

data['checks']= Array.wrap(data['checks']) << DateTime.now

但是想想更优雅的方式是这样的:

data['checks']= Array.wrap(data['checks']) + [DateTime.now]

Array.wrap返回一个空白数组或现有数组。 Plus运算符将合并两个数组并将新数组分配给data['checks']

答案 5 :(得分:0)

if data[:checks]
  data[:checks] << DateTime.now
else
  data[:checks] = [DateTime.now]
end

一个班轮

data[:checks] ? data[:checks] << DateTime.now : data[:checks] = [DateTime.now]