检查Ruby中的数组数组中是否不存在值

Ale*_*eue 2 ruby

我有一些数据,这些数据排列在一个数组数组中,如下所示:

[[date1, value1], [date2, value2], [date3, value3]]
i.e. [["6-01-13", 5], ["6-03-13", 2], ["6-04-13", 11]]
Run Code Online (Sandbox Code Playgroud)

我的问题是我的图形工具没有绘制"6-02-13"的任何数据,而我希望它图0.

我有另一个所有有效日期的数组,例如 ["6-01-13", "6-02-13", "6-03-13", ...]

[date, 0]在我的数据数组中插入数据数组中尚未存在的所有日期的最佳方法是什么?我不关心数组的排序.

我想我会做一些事情:

dates_array.each do |date|
  unless data_array.has_date(date)
    data_array.push([date, 0])
  end
end
Run Code Online (Sandbox Code Playgroud)

但我想不出这个has_date(date)方法应该如何工作而不循环遍历所有日期并检查该日期是否在我的数据数组中表示(这将天真地成为循环循环,因此并不理想).

编辑:现有数据(和日期)作为数组从数据库中提取.

Cat*_*per 5

将数组数组转换为默认值为零的哈希:

def data_to_hash(data)
  Hash.new(0).merge(Hash[data])
end

data = [["6-01-13", 5], ["6-03-13", 2], ["6-04-13", 11]]

hashed_data = data_to_hash(data)
p hashed_data['6-02-13']
p hashed_data['6-01-13']
Run Code Online (Sandbox Code Playgroud)

输出:

0
5
Run Code Online (Sandbox Code Playgroud)

不在数组中的任何日期都将返回0.使用散列作为数据结构在大型数据集上比在数组中迭代寻找日期要快得多.

回答更新

要使无效键"粘贴"到散列,可以使用Hash #new的块变体:

def data_to_hash(data)
  Hash.new { |h,k| h[k] = 0 }.merge(Hash[data])
end

data = [["6-01-13", 5], ["6-03-13", 2], ["6-04-13", 11]]
hashed_data = data_to_hash(data)

p hashed_data
%w{6-03-13 7-8-99}.each do |d|
  p hashed_data[d]
end
p hashed_data
Run Code Online (Sandbox Code Playgroud)

输出:

{"6-01-13"=>5, "6-03-13"=>2, "6-04-13"=>11}
2
0
{"6-01-13"=>5, "6-03-13"=>2, "6-04-13"=>11, "7-8-99"=>0}
Run Code Online (Sandbox Code Playgroud)

在此示例中,原始数据集中不存在7-8-99,但是在访问该密钥时将其设置为0.