2014-10-27 74 views
0

我从mashable.com拉取一个哈希值,我需要计算作者名称的实例(作者是关键字,值是作者姓名)。 mashable's api计算一个值在哈希中重复的次数

{ 
new: [ 
{ 
    other_keys: 'other_values'... 
    author: 'Author's Name' 
} 
] 

我想遍历散列,拉出作者的名字,再算上它是从混搭API的整个列表重复倍。

这是我的;它将哈希变成一个数组,迭代它,将计数添加到每个作者名称作为关键字,然后将重复数作为值添加。

这会很好,但我无法从mashable中将它恢复到原始散列,以添加所有我想显示的其他散列项。

all_authors = [] 

all_stories.each do |story| 
    authors = story['author'] 
    all_authors << authors 
end 

counts = Hash.new(0) 

all_authors.each do |name| 
    counts[name] += 1 
end 

counts.each do |key, val| 
    puts "#{key}: " "#{val}" 
end 

那请问什么是应该,但我试图把它放回原来的哈希来自Mashable:

all_stories.each do |com| 
    plorf = com['comments_count'].to_i 
    if plorf < 1 
     all_stories.each do |story| 
      puts "Title:\n" 
      puts story['title'] 
      puts "URL:\n" 
      puts story['short_url'] 
      puts "Total Shares:\n" 
      puts story['shares']['total'] 
     end 
    end 
    end 

当我到重复删除代码后面,它所做的一切是迭代初始的,每次输入后,我都会得到所有作者的列表以及他们编写的故事的数量,而不是列出每个与每个故事其他信息相关的作者以及他们编写的故事的数量。

任何帮助,非常感谢。

回答

0

@Michael Kohl这是一个很好的答案,我想我问的是错误的问题。彼时我这样做:

author = story['author'] 
puts "Number of stories by #{story['author']}: #{author_count['author']}" 

在我的“all_stories”环......

是啊,我敢肯定,我试图“重新注入”的价值观,以原来的乱码,这是方式错了...

非常感谢您的帮助,虽然

1

下面是一个简化版本:

h = { a: 1, b: 2, c: 1, d: 1 } 
h.count { |_, v| v == 1 } #=> 3 
h.values.count(1)   #=> 3 

另外,您还可以通过按键和组再算上:

h.group_by(&:last).map { |v, a| [v, a.count] }.to_h #=> {1=>3, 2=>1} 

这组哈希其值,计数数组中的时代元素的键/值对。下面是一个更明确的版本:

grouped = h.group_by(&:last) #=> {1=>[[:a, 1], [:c, 1], [:d, 1]], 2=>[[:b, 2]]} 
    grouped.map { |v, a| [v, a.count] #=> [[1, 3], [2, 1]] 

然后最终to_h满2个元件阵列的阵列转换为哈希。

+0

我需要输入值,我比较每个关键,我想比较吗? – 2014-10-27 05:35:43

+0

@DavidJohnson这是否回答了您的问题? – 2014-10-28 09:57:04

+0

我在下面回答 – 2014-10-30 17:52:50