首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >筛选散列数组的散列,以只获取特定的键和值

筛选散列数组的散列,以只获取特定的键和值
EN

Stack Overflow用户
提问于 2013-08-01 22:34:09
回答 1查看 1.5K关注 0票数 1

使用psd.rb宝石返回psd文件的属性的散列。不过,我想以某种方式过滤结果,只是字体名称。是否有一种方法可以获得嵌套在某个散列中的键的值,例如:字体散列。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-02 06:27:55

代码语言:javascript
运行
复制
require 'json'

# h = <paste object from your gist here, and remove any characters that cause ruby to error>
             
def key_occurences(obj, k)

  # deal with arrays recursively
  return obj.map {|x| key_occurences(x,k) } if obj.is_a?(Array)

  # otherwise assume we have a Hash
  obj.to_a.map do |x|
    return x[1] if x[0] == k
    return key_occurences(x[1], k) if x[1].is_a?(Array) || x[1].is_a?(Hash) #recurse again if our key is itself a Hash or Array
  end.compact
end

puts key_occurences(h, :font).to_json

你的产出将是:

代码语言:javascript
运行
复制
[[{"name":"Georgia","sizes":[16.0],"colors":[[255,102,102,102]],"css":"font-family: \"Georgia\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 16.0pt;\ncolor: rgba(102, 102, 102, 255);"},{"name":"AntennaCond-Black","sizes":[16.0],"colors":[[255,89,89,87]],"css":"font-family: \"AntennaCond-Black\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 16.0pt;\ncolor: rgba(89, 89, 87, 255);"},[],[],[],[],[],[],{"name":"ArialMT","sizes":[15.0],"colors":[[255,51,51,51]],"css":"font-family: \"ArialMT\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 15.0pt;\ncolor: rgba(51, 51, 51, 255);"},{"name":"Georgia","sizes":[19.0],"colors":[[255,167,148,72]],"css":"font-family: \"Georgia\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 19.0pt;\ncolor: rgba(167, 148, 72, 255);"},[],[],[]],[[{"name":"MyriadPro-Regular","sizes":[65.0],"colors":[[255,255,255,255]],"css":"font-family: \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 65.0pt;\ncolor: rgba(255, 255, 255, 255);"},{"name":"ArialMT","sizes":[14.0],"colors":[[255,255,255,255]],"css":"font-family: \"ArialMT\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 14.0pt;\ncolor: rgba(255, 255, 255, 255);"},{"name":"Georgia","sizes":[18.0],"colors":[[255,255,255,255]],"css":"font-family: \"Georgia\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 18.0pt;\ncolor: rgba(255, 255, 255, 255);"},[],[],[],[],[],[],[],[],{"name":"AntennaCond-Black","sizes":[18.0,25.0],"colors":[[255,89,89,87]],"css":"font-family: \"AntennaCond-Black\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 18.0pt;\ncolor: rgba(89, 89, 87, 255);"},{"name":"AntennaCond-Black","sizes":[28.0],"colors":[[255,229,42,49]],"css":"font-family: \"AntennaCond-Black\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 28.0pt;\ncolor: rgba(229, 42, 49, 255);"},{"name":"AntennaCond-Black","sizes":[28.0],"colors":[[255,255,255,255]],"css":"font-family: \"AntennaCond-Black\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 28.0pt;\ncolor: rgba(255, 255, 255, 255);"},[],{"name":"AntennaCond-Black","sizes":[28.0],"colors":[[255,255,255,255]],"css":"font-family: \"AntennaCond-Black\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 28.0pt;\ncolor: rgba(255, 255, 255, 255);"},{"name":"AntennaCond-Black","sizes":[15.0],"colors":[[255,229,42,49]],"css":"font-family: \"AntennaCond-Black\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 15.0pt;\ncolor: rgba(229, 42, 49, 255);"},[],{"name":"AntennaCond-Black","sizes":[24.0,39.0],"colors":[[255,255,255,255]],"css":"font-family: \"AntennaCond-Black\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 24.0pt;\ncolor: rgba(255, 255, 255, 255);"},[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],{"name":"Georgia","sizes":[18.0,16.0],"colors":[[255,165,146,70],[255,102,102,102]],"css":"font-family: \"Georgia\", \"Georgia-Italic\", \"MyriadPro-Regular\", \"AdobeInvisFont\";\nfont-size: 18.0pt;\ncolor: rgba(165, 146, 70, 255);"},[],[],[],[],[],[]]],[]]

现在,您可以进一步处理所需的特定字体信息。

编辑:

根据我们的评论意见,试着:

代码语言:javascript
运行
复制
def unwrap(arr)
  return arr if arr[0].is_a?(Hash)
  return nil if arr.is_a?(Array) && arr.size == 0
  unwrap(arr[0])
end

answer = key_occurences(h, :font).map! do |x| 
  unwrap(x)
end.compact!.flatten!

puts answer.map {|x| x[:name]}.uniq

其中产出:

代码语言:javascript
运行
复制
Georgia
AntennaCond-Black
ArialMT
MyriadPro-Regular
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18005794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档