如何转换哈希符号

时间:2016-08-23 13:11:49

标签: ruby regex hash

我有一个哈希:

{:name=>"testname", :data=>"[209.04, 110.97, 38.83, 234.18]"}

我想将其转换为:

{name: "testname", data: [209.04, 110.97, 38.83, 234.18]}

3 个答案:

答案 0 :(得分:3)

我觉得您希望将Ruby数组转换为JavaScript:

require 'json'

# parse the string to get the included JSON
hash = { :name => "testname", :data => "[209.04, 110.97, 38.83, 234.18]" }
hash[:data] = JSON.parse(hash[:data])

# hash look like this now
# { :name => "testname" , :data => [209.04, 110.97, 38.83, 234.18] }

# translate to json to use with highchart:
hash.to_json
#=> { "name": "testname", "data": [209.04,110.97,38.83,234.18] }

答案 1 :(得分:1)

当您说要创建类似

的内容时
[209.04, 110.97, 38.83, 234.18]

首先需要确定数字所需的数据类型。如果您只是使用Ruby 209.04编写,类型为Float,但根据您要对数据执行的操作,您可能会考虑使用BigDecimal代替。

以下是获取浮点数组的解决方案:

myhash = {:name=>"testname", :data=>"[209.04, 110.97, 38.83, 234.18]"}
myhash[:data] = myhash[:data][1..-2].split(/,\s*/).map(&:to_f)

如果你更喜欢BigDecimal,它会是这样的:

require 'bigdecimal'
myhash = {:name=>"testname", :data=>"[209.04, 110.97, 38.83, 234.18]"}
myhash[:data] = myhash[:data][1..-2].split(/,\s*/).map { |string| BigDecimal.new(string) }

答案 2 :(得分:1)

你的问题并不是很清楚,看起来你不了解Ruby的哈希以及它们是如何显示的。调解这些:

hash = {a:1}
hash # => {:a=>1}

hash的密钥为:a符号。检查时,Ruby使用=>表示法显示哈希值,因此{a:1}显示为{:a => 1}。它是相同的哈希,只是第二种显示它们的原始方式适用于符号和非符号键:

hash = {a:1, 'b' => 2}
hash # => {:a=>1, "b"=>2}

继续......

转换:data值可以通过多种方式完成,但我会这样做:

hash = {name: "testname", data: "[209.04, 110.97, 38.83, 234.18]"}
hash[:data] # => "[209.04, 110.97, 38.83, 234.18]"

require 'json'
JSON[hash[:data]] # => [209.04, 110.97, 38.83, 234.18]

数据看起来像是一个JSON编码的浮点数组,所以请这样对待。

把所有这些放在一起:

hash[:data] = JSON[hash[:data]]
hash # => {:name=>"testname", :data=>[209.04, 110.97, 38.83, 234.18]}

此时hash相当于:

{name: "testname", data: [209.04, 110.97, 38.83, 234.18]} # => {:name=>"testname", :data=>[209.04, 110.97, 38.83, 234.18]}