Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在ruby中将散列转换为数组_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 在ruby中将散列转换为数组

Ruby on rails 在ruby中将散列转换为数组,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我需要下一个哈希: x = { params: { user_params1: { name: "stephen", dir: "2001", dir2: nil }, user_params2: { name: "josh", dir: "jhon", dir2: nil } } 要返回如下所示的数组的新哈希,请执行以下操作: x = { params: { user_params1: ["stephen","201", ""], user_param

我需要下一个哈希:

x = {
  params: {
    user_params1: { name: "stephen", dir: "2001", dir2: nil },
    user_params2: { name: "josh", dir: "jhon", dir2: nil }
}
要返回如下所示的数组的新哈希,请执行以下操作:

x = {
  params: {
    user_params1: ["stephen","201", ""],
    user_params2: ["josh","jhon",""]
}
鉴于:

尝试:

这将产生:

{:params=>{:user_params1=>["stephen", "2001", nil], :user_params2=>["josh", "jhon", nil]}}
如果希望使用空字符串而不是nils(如示例中所示),请执行以下操作:

如果不想修改
x
,则只需创建一个新的
哈希值
,并执行相同操作:

y ={}
y[:params] = x[:params].each_with_object({}) do |(k,v), returning|
  returning[k] = v.map{|k,v| v.to_s}
end
既然你没有用
v.map
中的
k
做任何事情,你可以只做
v.values.map(&:to_)
(不知羞耻地从Gerry的答案中偷来)-这更干净,依我看,但会让你多花一个字符(!)-最终得到:

y ={}
y[:params] = x[:params].each_with_object({}) do |(k,v), returning|
  returning[k] = v.values.map(&:to_s)
end
正如塞巴斯蒂安所指出的,这有语法上的糖分:

y[:params] = x[:params].transform_values do |value|
  # Then use one of:
  #   hash.values.map { |value| value.nil? ? '' : value }
  #   hash.values.map { |value| value ? value : '' }
  #   hash.values.map { |value| value || '' }
  #   hash.values.map(&:to_s)      
end
有趣的是,如果你看看, 您将看到,带有对象的
转换值的
每个\u机制非常相似:

def transform_values
  return enum_for(:transform_values) unless block_given?
  result = self.class.new
  each do |key, value|
    result[key] = yield(value)
  end
  result
end
你可以想象这句话被改写为:

def transform_values
  return enum_for(:transform_values) unless block_given?
  each_with_object(self.class.new) do |(key, value), result|
    result[key] = yield(value)
  end
end
从根本上说,这就是我和Gerry的想法


在我看来,这只猫的皮肤很好。

你使用
每个对象(两次,以防你在顶层有一个以上的键);例如:

x.each_with_object({}) do |(k, v), result|
  result[k] = v.each_with_object({}) do |(k1, v1), result1|
    result1[k1] = v1.values.map(&:to_s)
  end
end

#=> {:params=>{:user_params1=>["stephen", "2001", ""], :user_params2=>["josh", "jhon", ""]}}

第二件事是无效的。特别是,这些部分:
{“stephen”、“201”和
{“josh”、“jhon”和“}
。事实上,这也不是第一件事(您似乎缺少一个紧括号)。您遇到问题的代码是什么?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们有什么不同?请提供一个。你能提供你想要发生的事情的精确说明吗,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请同时确保提供一个“我需要下一个散列来返回这样的数组的新散列”-您可以通过编写一个程序来实现这一点。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行情况,在调试器中单步执行,然后对其进行休眠,从头开始,再次休眠,然后,也只有到那时,才能将你的问题缩小到一个简洁、集中、简单、简短、可重复的范围,并提出一个具体、集中、狭窄的问题。有趣的方法比较,不错。
def transform_values
  return enum_for(:transform_values) unless block_given?
  result = self.class.new
  each do |key, value|
    result[key] = yield(value)
  end
  result
end
def transform_values
  return enum_for(:transform_values) unless block_given?
  each_with_object(self.class.new) do |(key, value), result|
    result[key] = yield(value)
  end
end
x.each_with_object({}) do |(k, v), result|
  result[k] = v.each_with_object({}) do |(k1, v1), result1|
    result1[k1] = v1.values.map(&:to_s)
  end
end

#=> {:params=>{:user_params1=>["stephen", "2001", ""], :user_params2=>["josh", "jhon", ""]}}