gpt4 book ai didi

ruby - 在 Ruby 中将哈希值转换为另一个哈希值

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

我有一个字符串散列

navigable_objects = { 'Dashboard' => root_path,
'Timesheets' => timesheets_path,
'Clients' => clients_path,
'Projects' => projects_path,
}

我想将它们转换成另一个散列,其中键又是键,但值是字符串“active”或空字符串,具体取决于当前 Controller 名称是否包含键。

例如,假设当前 Controller 名称是“ClientsController”。我应该得到的结果是:

{ 'Dashboard' => '',
'Timesheets' => '',
'Clients' => 'active',
'Projects' => ''
}

这是我目前的做法:

active = {}

navigable_objects.each do |name, path|
active[name] = (controller.controller_name.include?(name)) ? 'active' : '')
end

我觉得虽然这行得通,但在 Ruby 中有更好的方法可以做到这一点,可能是使用 injecteach_with_objects

最佳答案

更新:我发布了另一个我认为更适合您的情况的答案。不过,我不对这一篇进行编辑,因为它对解决类似问题有其自身的值(value)。

这是我的做法:

Hash[*navigable_objects.map{ |k,v| [k, controller.controller_name.include?(k) ? 'active' : ''] }.flatten]

您可以在获取键值对作为 block 输入的散列上运行 map。然后你可以将键/值对构造成数组作为输出。最后,运行 Hash[*key_value_pairs.flatten] 是将其变回散列的一个好技巧。这是可行的,因为您可以将参数数组传递给 Hash[] 构造函数以生成哈希 (Hash[1, 2, 3, 4] => { 1 => 2, 3 => 4 })。 flatten 将键值对转换为数组,* 运算符将数组转换为参数列表。

如果您想更清楚地了解发生了什么,这里有一个详细的版本:

key_value_pairs = navigable_objects.map do |key, value|
new_value = controller.controller_name.include?(k) ? 'active' : ''
[key, new_value]
end

new_hash = Hash[*key_value_pairs.flatten]

更新:以上与 ruby​​ 1.8 兼容。正如安德鲁在评论中指出的那样:

In 1.9 you don't need the * or flatten as Hash[] takes key-value array pairs

关于ruby - 在 Ruby 中将哈希值转换为另一个哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694342/

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