加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby删除哈希数组中的重复条目,但基于多个值

发布时间:2020-12-16 21:14:17 所属栏目:百科 来源:网络整理
导读:我已经看到了很多关于这个的问题,但只有一个键,从不用于多个键. 我有以下哈希数组: a = [{:name="Yes,Yes,Yes",:artist="Some Dude",:composer= 'First Dude',:duration="3:21"},{:name="Chick on the Side",:artist="Another Dude",:duration="3:20"},{:na
我已经看到了很多关于这个的问题,但只有一个键,从不用于多个键.

我有以下哈希数组:

a = [{:name=>"Yes,Yes,Yes",:artist=>"Some Dude",:composer=> 'First Dude',:duration=>"3:21"},{:name=>"Chick on the Side",:artist=>"Another Dude",:duration=>"3:20"},{:name=>"Luv Is",:duration=>"3:13"},{:name=>"Yes,:duration=>"2"},:artist=>"Another Dude"}]

a.uniq在这里不起作用,因为持续时间不同或甚至不存在.我在数据库中设置了一个唯一的密钥,不允许使用相同名称,艺术家和作曲家的重复条目,因此当人们对这3个密钥有重复的条目时,我有时会遇到错误.

有没有办法运行uniq来检查这3个键?我试过像这样的块:

new_tracks.uniq do |a_track|
   a_track[:name]
   a_track[:artist]
   a_track[:composer]
 end

但是忽略了密钥不存在的任何东西(没有作曲家的任何条目都不符合上述标准).

我总是可以使用:name键,但这意味着我将摆脱具有相同标题但不同的艺术家或作曲家的编辑中的潜在有效曲目.

这是Ruby 2.0.

解决方法

uniq接受一个区块.如果给出了一个块,它将使用块的返回值进行比较.

您的代码接近解决方案,但在您的代码中,返回值只是a_track [:composer],这是最后一次计算的语句.

您可以将所需的属性加入到字符串中并返回该字符串.

new_tracks.uniq { |track| [track[:name],track[:artist],track[:composer]].join(":") }

可能的重构是

new_tracks.uniq { |track| track.attributes.slice('name','artist','composer').values.join(":") }

或者在模型中添加执行连接的自定义方法,然后调用它

class Track < ActiveRecord::Base
  def digest
    attributes.slice('name','composer').values.join(":")
  end
end

new_tracks.uniq(&:digest)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读