"Some Dude", :compose-6ren">
gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:01:42 25 4
gpt4 key购买 nike

我已经看到很多关于此的问题,但只有一个键,从来没有多个键。

我有以下哈希数组:

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, Yes, Yes", :artist=>"Some Dude", :composer=> 'First Dude', :duration=>"2"},
{:name=>"Chick on the Side", :artist=>"Another Dude"}]

a.uniq 在这里不起作用,因为持续时间不同或者甚至可能不存在。我在数据库中设置了一个唯一的 key ,不允许重复输入相同的名称、艺术家和 Composer ,所以当人们对这 3 个 key 有重复的条目时,我有时会出错。

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

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

但这会忽略任何不存在 key 的内容(例如,任何没有 Composer 的条目都不符合上述条件)。

我总是可以只使用 :name 键,但这意味着我要摆脱具有相同标题但不同艺术家或 Composer 的合辑中可能有效的轨道。

这是针对 Ruby 2.0 的。

最佳答案

uniq接受一个 block 。如果给定一个 block ,它将使用 block 的返回值进行比较。

您的代码接近解决方案,但在您的代码中,返回值仅为 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', 'artist', 'composer').values.join(":")
end
end

new_tracks.uniq(&:digest)

关于ruby-on-rails - Ruby 删除哈希数组中的重复条目,但基于多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com