[英]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.