繁体   English   中英

在哈希内添加或插入数组

[英]add or insert to array inside a hash

我有一个哈希data命名data和一个名为checks的键,它是一个日期数组。 如果键存在,我想追加到现有数组。 如果键不存在,则需要添加具有当前日期的数组。 有没有一种优雅的方法可以在红宝石中做到这一点?

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

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

通常我会这样攻击它:

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

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

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

这样,您就不必担心||=因为分配会自动发生。

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

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

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

编辑这是另一个没有人提及的选择:

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

EDIT2而不使用(可能会混淆)splat运算符:

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

Hash#fetch会获取一个键和一个值(如果键丢失)。 也许比喷洒到数组文字要优雅得多。

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

但是认为更优雅的方式是这样的:

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

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

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

一支班轮

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM