我有以下数组。
[
{"title"=>"un", "link"=>nil, "description"=>""},
{"title"=>"deux", "link"=>"https://apple.com", "description"=>"Products"},
{"title"=>"three", "link"=>"http://www.amazon.com", "description"=>"Welcome"},
{"title"=>"four", "link"=>"https://apple.com", "description"=>"iPad"},
]
我想删除链接为nil
或为空的哈希,返回一个要获取的链接数组:
["https://apple.com", "http://amazon"]
不知道如何删除散列并只获取唯一链接。
删除空(""
)和nil
值:
arr.map { |a| a["link"] }.reject(&:blank?).uniq
正如@Arup所指出的,blank
在Rails中,纯Ruby解决方案是:
arr.map { |a| a["link"] }.reject{|e| e == "" || e == nil}.uniq
请像下面的代码一样尝试
arr.map {|o| o['link'] }.reject { |e| e.to_s.empty? }.uniq
解决方案:
a = [
{"title"=>"un", "link"=>nil, "description"=>""},
{"title"=>"deux", "link"=>"https://apple.com", "description"=>"Products"},
{"title"=>"three", "link"=>"http://www.amazon.com", "description"=>"Welcome"},
{"title"=>"four", "link"=>"https://apple.com", "description"=>"iPad"},
]
a.map{|data| data["link"] }.reject(&:blank?).uniq
解释:
a是散列的数组
Map将遍历数组中的每个散列,并创建一个仅具有"链接"值的新数组。如果原始哈希没有链接键,它将在新数组中创建一个nil值。
Example result after map:
[nil, "https://apple.com", "https://www.amazon.com", "https://apple.com"]
拒绝然后调用轨道主动支持方法空白?在数组中的每个项目上,如果为空?return true返回一个没有值的新数组:
[nil.blank?, "https://apple.com".blank?, "https://www.amazon.com".blank?, "https://apple.com".blank?]
Result:
["https://apple.com", "https://www.amazon.com", "https://apple.com"]
然后Uniq生成一个没有重复的数组(另一种选择是使用ruby集)
["https://apple.com", "https://www.amazon.com"]
您可以通过:
arr.map {|o| o['link'] }.compact.uniq
compact
移除所有nil
,并且uniq
返回唯一值。
您可以使用Enumerable#each_with_object
:
array.each_with_object([]) do |h, a|
a << h['link'] unless h['link'].nil? || h['link'].empty?
end.uniq
# => ["https://apple.com", "http://www.amazon.com"]