Arrays Ruby:根据条件迭代和嵌套哈希

Arrays Ruby:根据条件迭代和嵌套哈希,arrays,ruby,hash,Arrays,Ruby,Hash,我有两个哈希数组,如下所示: h1=[{id:1, item:1, from: DateTime.new(2017,9,4,6,0,0,'+0300'), to: DateTime.new(2017,9,4,17,59,59,'+0300'), value:10}, {id:1, item:2, from: DateTime.new(2017,9,4,18,0,0,'+0300'), to: DateTime.new(2017,9,4,23,59,59,'+0300'), value:1

我有两个哈希数组,如下所示:

h1=[{id:1, item:1, from: DateTime.new(2017,9,4,6,0,0,'+0300'), to: DateTime.new(2017,9,4,17,59,59,'+0300'), value:10},
    {id:1, item:2, from: DateTime.new(2017,9,4,18,0,0,'+0300'), to: DateTime.new(2017,9,4,23,59,59,'+0300'), value:10}]

h2=[{id:1, item:1, date: DateTime.new(2017,9,4,6,10,0,'+0300'), value:5},
    {id:2, item:1, date: DateTime.new(2017,9,4,7,20,0,'+0300'), value:7},
    {id:3, item:1, date: DateTime.new(2017,9,4,8,05,0,'+0300'), value:10},
    {id:4, item:1, date: DateTime.new(2017,9,4,18,19,10,'+0300'), value:1},
    {id:5, item:2, date: DateTime.new(2017,9,4,19,20,0,'+0300'), value:2},
    {id:6, item:2, date: DateTime.new(2017,9,4,22,22,0,'+0300'), value:5},
    {id:7, item:2, date: DateTime.new(2017,9,5,23,0,0,'+0300'), value:1}]
=> [:order=>{:id=>1,
  :item=>1,
  :from=>Mon, 04 Sep 2017 06:00:00 +0300,
  :to=>Mon, 04 Sep 2017 17:59:59 +0300,
  :value=>10,
  :inventory=>
   {:id=>1, :item=>1, :date=>Mon, 04 Sep 2017 06:10:00 +0300, :value=>5},
   {:id=>2, :item=>1, :date=>Mon, 04 Sep 2017 07:20:00 +0300, :value=>7},
   {:id=>3, :item=>1, :date=>Mon, 04 Sep 2017 08:05:00 +0300, :value=>10}
  :order=>{:id=>1,
  :item=>2,
  :from=>Mon, 04 Sep 2017 18:00:00 +0300,
  :to=>Mon, 04 Sep 2017 23:59:59 +0300,
  :value=>10,
  :inventory=>
   {:id=>4, :item=>2, :date=>Mon, 04 Sep 2017 18:19:10 +0300, :value=>1},
   {:id=>5, :item=>2, :date=>Mon, 04 Sep 2017 19:20:00 +0300, :value=>2},
   {:id=>6, :item=>2, :date=>Mon, 04 Sep 2017 22:22:00 +0300, :value=>5},
   {:id=>7, :item=>2, :date=>Mon, 04 Sep 2017 23:00:00 +0300, :value=>1}}]
我需要在每个
h1
下嵌套
h2
中符合条件的任何哈希:

  • item
    值(例如,两个哈希中的
    item:1
  • date
    from
    h2
    from
    -
    范围内
    h1
  • 到目前为止,我可以简单地将所有散列嵌套在
    h1
    下,使用以下内容:

    my_hash = h1.each do 
      |mh| mh[:inventory]=h2
    end
    
    my_hash = h1.each do |hsh| 
      h2.each do |hsh2| 
        hash=hsh2.find{|h| h[:item] == hsh[:item] && h[:date].between?(hsh[:from],hsh[:to])} if hash
        hsh[:inventory] = hash
      end 
    end
    
    我相信可以通过以下方式实现:

    h2.find{ |i| i[:item] == h1[:item] && i[:date].between?(h2[:from], h2[:to]) }
    
    请问,我如何将其组合起来才能使其工作?谢谢大家!

    更新2

    我试图为每个
    h1
    匹配的
    h2
    查找与此匹配的哈希:

    my_hash = h1.each do 
      |mh| mh[:inventory]=h2
    end
    
    my_hash = h1.each do |hsh| 
      h2.each do |hsh2| 
        hash=hsh2.find{|h| h[:item] == hsh[:item] && h[:date].between?(hsh[:from],hsh[:to])} if hash
        hsh[:inventory] = hash
      end 
    end
    
    但是,我从(pry):12:的“hash”
    中得到错误的参数数目(给定1,预期为0)。 请问我做错了什么

    更新3 如果可能,理想输出如下:

    h1=[{id:1, item:1, from: DateTime.new(2017,9,4,6,0,0,'+0300'), to: DateTime.new(2017,9,4,17,59,59,'+0300'), value:10},
        {id:1, item:2, from: DateTime.new(2017,9,4,18,0,0,'+0300'), to: DateTime.new(2017,9,4,23,59,59,'+0300'), value:10}]
    
    h2=[{id:1, item:1, date: DateTime.new(2017,9,4,6,10,0,'+0300'), value:5},
        {id:2, item:1, date: DateTime.new(2017,9,4,7,20,0,'+0300'), value:7},
        {id:3, item:1, date: DateTime.new(2017,9,4,8,05,0,'+0300'), value:10},
        {id:4, item:1, date: DateTime.new(2017,9,4,18,19,10,'+0300'), value:1},
        {id:5, item:2, date: DateTime.new(2017,9,4,19,20,0,'+0300'), value:2},
        {id:6, item:2, date: DateTime.new(2017,9,4,22,22,0,'+0300'), value:5},
        {id:7, item:2, date: DateTime.new(2017,9,5,23,0,0,'+0300'), value:1}]
    
    => [:order=>{:id=>1,
      :item=>1,
      :from=>Mon, 04 Sep 2017 06:00:00 +0300,
      :to=>Mon, 04 Sep 2017 17:59:59 +0300,
      :value=>10,
      :inventory=>
       {:id=>1, :item=>1, :date=>Mon, 04 Sep 2017 06:10:00 +0300, :value=>5},
       {:id=>2, :item=>1, :date=>Mon, 04 Sep 2017 07:20:00 +0300, :value=>7},
       {:id=>3, :item=>1, :date=>Mon, 04 Sep 2017 08:05:00 +0300, :value=>10}
      :order=>{:id=>1,
      :item=>2,
      :from=>Mon, 04 Sep 2017 18:00:00 +0300,
      :to=>Mon, 04 Sep 2017 23:59:59 +0300,
      :value=>10,
      :inventory=>
       {:id=>4, :item=>2, :date=>Mon, 04 Sep 2017 18:19:10 +0300, :value=>1},
       {:id=>5, :item=>2, :date=>Mon, 04 Sep 2017 19:20:00 +0300, :value=>2},
       {:id=>6, :item=>2, :date=>Mon, 04 Sep 2017 22:22:00 +0300, :value=>5},
       {:id=>7, :item=>2, :date=>Mon, 04 Sep 2017 23:00:00 +0300, :value=>1}}]
    

    对于每个
    h1
    我想给出新的键
    顺序
    ,然后在
    inventory
    键下嵌套适当的
    h2
    散列。

    这在ruby 2.4.2p198(2017-09-14修订版59899)[x64-mingw32]

    h1.each do |hsh1|
        hsh1[:inventory] =
            h2.find do |hsh2|
                hsh2[:item] == hsh1[:item] &&
                hsh2[:date].between?(hsh1[:from],hsh1[:to])
            end || Hash.new
    end
    

    您可以通过用所需的默认值替换
    散列来使用默认值hsh1[:inventory]。new

    是否可以添加预期的输出?两个输入散列中都没有键
    :inventory
    。@SebastiánPalma,请参阅上面我的更新3,其中我添加了输出示例+扩展了我关于父项和子项哈希键的问题。@mudasobwa请参阅上面我的更新3,其中我用输出示例清除了我的问题。谢谢,但是它似乎只将
    h2
    中的单个哈希嵌套在
    h1
    下,不可能全部嵌套。请看一下我上面的更新3,我添加了输出示例并澄清了我的问题,好吗?愚蠢的我,我可以用
    find_all
    替换
    find_all
    ,然后它将嵌套所有符合我的条件的哈希:)