替换数组中的元素(ruby)

Chr*_*ris 0 ruby arrays

我有2个对象数组,我想合并它们,以便生成的数组将包含第一个数组中的所有元素,替换第二个数组具有相同id对象的任何元素.

  finalArr=[]
  arr1.each do |e1|
    set2Contains=false
    arr2.each do |e2|
      if(e2.id==e1.id)
        set2Contains=true
      end
    end
    if(set2Contains)
      finalArr.push(e2)
    else
      finalArr.push(e1)
    end
  end
Run Code Online (Sandbox Code Playgroud)

我是红宝石的新手,但由于它是一个衬里的王者,上面看起来有点冗长.我想知道我的代码是否可以以任何方式缩短/优化?

谢谢你的任何建议

Rom*_*ain 5

您需要使第二个数组成为ID的哈希值,因此您不必每次都扫描它:

hash = Hash.new
arr2.collect{|x| hash[x.id] = x}
Run Code Online (Sandbox Code Playgroud)

然后你可以继续做:

finalArr = arr1.map{|x| hash.has_key?(x.id) ? hash[x.id] : x }
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的数组可以包含nil,可能需要警惕,在这种情况下我假设不是这种情况.