Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby中比较数组时填充缺少的条目_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在Ruby中比较数组时填充缺少的条目

Ruby on rails 在Ruby中比较数组时填充缺少的条目,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有三个带有计数的日期数组: first = [["July 01", "2"]["July 03", "2"]] second = [["June 30", "2"]["July 01", "2"]["July 02", "2"]] third = [["July 01", "2"]["July 02", "2"]] 我正在尝试(没有成功)比较三个数组,获得完整的日期范围,并将缺少的结果为0的数组注入到其他数组中。。。因此,最终每个数组都会有从6月30日到7月3日的日期条目,如下所示: fi

我有三个带有计数的日期数组:

first = [["July 01", "2"]["July 03", "2"]]
second = [["June 30", "2"]["July 01", "2"]["July 02", "2"]]
third = [["July 01", "2"]["July 02", "2"]]
我正在尝试(没有成功)比较三个数组,获得完整的日期范围,并将缺少的结果为0的数组注入到其他数组中。。。因此,最终每个数组都会有从6月30日到7月3日的日期条目,如下所示:

first = [["June 30", "0"]["July 01", "2"]["July 02", "0"]["July 03", "2"]]
second = [["June 30", "2"]["July 01", "2"]["July 02", "2"]["July 03", "0"]]
third = [["June 30", "0"]["July 01", "2"]["July 02", "2"]["July 03", "0"]]

我尝试了一系列非常复杂的比较(比如做演绎,存储为一个新数组,然后使用该数组添加到缺少的数组中,但是当有两个以上的数组需要比较时,它会变得非常复杂)和注入来做这件事,但我认为使用Ruby或Rails一定有一种相对简单的方法来做这件事。有什么想法吗?

我有一个问题,为什么这是一个数组?如果你能把它变成一个散列,这个问题很容易处理。它可以看起来像这样:

first = {"july 01" => 2, "july 02" => 1}
second = {"june 31" => 1, "july 01" => 1}


keys = first.keys
keys << second.keys

keys.each do |key|
  first[key] = first[key] || 0
end
first={“july 01”=>2,“july 02”=>1}
第二个={“6月31日”=>1,“7月1日”=>1}
keys=first.keys

键您可以获取所有数组的并集,然后从中计算

all = first | second | third
 #=> [["July 01", "2"], ["July 03", "2"], ["June 30", "2"], ["July 02", "2"]]

(first | all).map { |k, v| first.include?([k, v]) ? [k, v] : [k, "0"] }
             .sort_by { |i| [ Time.new(0, i[0][0..2]).month, i[0][-2..-1] ] }

 #=> [["June 30", "0"], ["July 01", "2"], ["July 02", "0"], ["July 03", "2"]]

这里还有另一种方法,使用
Date

require 'date'

def compare_dates(*items)
  all_dates = items.flatten(1).map { |d| Date.parse(d.first) }
  str_dates = (all_dates.min..all_dates.max).map { |d| d.strftime("%B %d") }

  items.map do |arr|
    str_dates.map do |date|
      current = arr.select { |e| e[0] == date }.flatten
      current.empty? ? [date, "0"] : current
    end
  end
end

compare_dates(first, second, third)
#=> [[["June 30", "0"], ["July 01", "2"], ["July 02", "0"], ["July 03", "2"]],
#    [["June 30", "2"], ["July 01", "2"], ["July 02", "2"], ["July 03", "0"]],
#    [["June 30", "0"], ["July 01", "2"], ["July 02", "2"], ["July 03", "0"]]]
如果要覆盖每个数组的值,可以执行以下操作:

first, second, third = compare_dates(first, second, third)

first
#=> [["June 30", "0"], ["July 01", "2"], ["July 02", "0"], ["July 03", "2"]]

second
#=> [["June 30", "2"], ["July 01", "2"], ["July 02", "2"], ["July 03", "0"]]

third
#=> [["June 30", "0"], ["July 01", "2"], ["July 02", "2"], ["July 03", "0"]]
步骤如下

b = arr.flatten(1)
  #=> [["July 01", "2"], ["July 03", "2"], ["June 30", "2"], ["July 01", "2"],
  #    ["July 02", "2"], ["July 01", "2"], ["July 02", "2"]]
c = b.map(&:first)
  #=> ["July 01", "July 03", "June 30", "July 01", "July 02", "July 01", "July 02"]
d = c.uniq
  #=> ["July 01", "July 03", "June 30", "July 02"]
e = d.sort_by { |s| Date.strptime(s, '%B %d') }
  #=> ["June 30", "July 01", "July 02", "July 03"] 
f = e.product(['0'])
  #=> [["June 30", "0"], ["July 01", "0"], ["July 02", "0"], ["July 03", "0"]]
default = f.to_h
  #=> {"June 30"=>"0", "July 01"=>"0", "July 02"=>"0", "July 03"=>"0"}
计算

arr.map { |a| default.merge(a.to_h).to_a }
arr
的第一个值被传递到块,块变量
a
被设置为该值,并执行块计算

  a = arr.first
    #=> [["July 01", "2"], ["July 03", "2"]]
  g = a.to_h
    #=> {"July 01"=>"2", "July 03"=>"2"}
  h = default.merge(g)
    #=> {"June 30"=>"0", "July 01"=>"2", "July 02"=>"0", "July 03"=>"2"}
  h.to_a
    #=> [["June 30", "0"], ["July 01", "2"], ["July 02", "0"], ["July 03", "2"]]
arr
的其他值的计算类似


有关
d
的计算,请参见。

谢谢,但这并没有真正的帮助。我已经写了一些可以处理两个数组(或者散列,没关系)的东西。我需要一种方法,可以比较三个或更多数组并返回所需的结果,而不会太复杂。我想我可能一开始就缺少了一个核心ruby方法。干净、简洁、漂亮。谢谢你,格里。
  a = arr.first
    #=> [["July 01", "2"], ["July 03", "2"]]
  g = a.to_h
    #=> {"July 01"=>"2", "July 03"=>"2"}
  h = default.merge(g)
    #=> {"June 30"=>"0", "July 01"=>"2", "July 02"=>"0", "July 03"=>"2"}
  h.to_a
    #=> [["June 30", "0"], ["July 01", "2"], ["July 02", "0"], ["July 03", "2"]]