当前位置:  开发笔记 > 后端 > 正文

Ruby Hash白名单过滤器

如何解决《RubyHash白名单过滤器》经验,为你挑选了6个好方法。

我试图找出如何将键和值对从一个过滤器过滤到另一个过滤器

例如,我想采取这个哈希

x = { "one" => "one", "two" => "two", "three" => "three"}

y = x.some_function

y == { "one" => "one", "two" => "two"}

谢谢你的帮助

编辑:应该提一下,在这个例子中,我希望它表现为白名单过滤器.也就是说,我知道我想要什么,而不是我不想要的.



1> Brian Guthri..:

Rails的ActiveSupport库还为您提供切片,除了在关键级别处理哈希:

y = x.slice("one", "two") # => { "one" => "one", "two" => "two" }
y = x.except("three")     # => { "one" => "one", "two" => "two" }
x.slice!("one", "two")    # x is now { "one" => "one", "two" => "two" }

这些都很好,我一直都在使用它们.



2> sris..:

也许这就是你想要的.

wanted_keys = %w[one two]
x = { "one" => "one", "two" => "two", "three" => "three"}
x.select { |key,_| wanted_keys.include? key }

包含在例如Array和Hash中的Enumerable mixin提供了很多有用的方法,比如select/reject/each/etc.我建议你看一下ri Enumerable的文档.


对于1.8.7使用`reject`并否定条件

3> scottd..:

你可以使用内置的Hash函数拒绝.

x = { "one" => "one", "two" => "two", "three" => "three"}
y = x.reject {|key,value| key == "three" }
y == { "one" => "one", "two" => "two"}

您可以将任何您想要的逻辑放入拒绝中,如果该块返回true,它将跳过新哈希中的该键值.


Downvote因为这是一个黑名单过滤器,但OP想要白名单.
@Radar破坏性修饰符可能会导致问题,例如,如果将哈希作为参数传递给方法,并且调用者不希望该方法修改哈希值.最好养成非破坏性更新的习惯,并在必要时仅使用破坏性操作符.

4> fotanus..:

改进一点@scottd答案,如果您使用rails并且列出了您需要的列表,则可以将列表作为参数从slice中展开.例如

hash = { "one" => "one", "two" => "two", "three" => "three"}
keys_whitelist = %W(one two)
hash.slice(*keys_whitelist)

如果没有rails,对于任何ruby版本,您可以执行以下操作:

hash = { "one" => "one", "two" => "two", "three" => "three"}
keys_whitelist = %W(one two)
Hash[hash.find_all{|k,v| keys_whitelist.include?(k)}] 



5> Brian Campbe..:
y = x.reject {|k,v| k == "three"}



6> stellard..:

结合每个人的答案,我提出了这个解决方案:

 wanted_keys = %w[one two]
 x = { "one" => "one", "two" => "two", "three" => "three"}
 x.reject { |key,_| !wanted_keys.include? key }
 =>{ "one" => "one", "two" => "two"}

谢谢你的帮助!

编辑:

以上工作在1.8.7+

以下适用于1.9+:

x.select {| key,_ | wanted_keys.include?键}

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有