我有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)
我是红宝石的新手,但由于它是一个衬里的王者,上面看起来有点冗长.我想知道我的代码是否可以以任何方式缩短/优化?
谢谢你的任何建议
您需要使第二个数组成为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,可能需要警惕,在这种情况下我假设不是这种情况.