如何根据索引从each_with_index内部的数组中打印内容?

时间:2019-01-16 12:11:36

标签: ruby

我有两个数组:

a = [1, 2, 3]
b = [{:item => 'apple', :quantity => 92}, {:item => 'banana', :quantity => 43}, {:item => 'kiwi', :quantity => 55}]

我想要这样的输出:

1. apple 92 2. banana 43 3. kiwi 55

现在,因为将数组b中的每个项目与数组a中的值的顺序对齐很重要,所以我决定编写一个each_with_index循环,以便能够从数组b中提取所需位置的数据:

a.each_with_index do |a_value, i| 
  puts a_value 
  puts '.' 
  puts b[i][:item] 
  puts b[i][:quantity]
end

但是我遇到了这个错误:

NoMethodError: undefined method `[]' for nil:NilClass
    from (irb):8:in `block in irb_binding'
    from (irb):8:in `each'
    from (irb):8:in `each_with_index'
    from (irb):8
    from C:/RailsInstaller/Ruby2.3.3/bin/irb.cmd:19:in `<main>'

我觉得很奇怪,因为该位置的哈希值不为空。

如果我在该位置打印数组的全部内容,则可以正常工作,例如:

a.each_with_index do |a_value, i| 
  puts b[i]
end

哪个给:

{:item => 'apple', :quantity => 92} 
{:item => 'banana', :quantity => 43} 
{:item => 'kiwi', :quantity => 55}

但是我无法在哈希中指定键来打印内容吗?这是怎么回事?

3 个答案:

答案 0 :(得分:1)

  

但是我无法在哈希中指定键来打印内容吗?这是怎么回事?

这当然没有道理。如果您有哈希,则可以获取其键/值。这里的问题是您没有有哈希。相反,您的b[i]之一为nil(这会触发错误)。

通过使用p b[i]而不是puts b[i]打印它们来进行检查。

答案 1 :(得分:0)

您不需要a数组

b.map(&:values).map.with_index {|(item, quantity), index| 
 "#{index + 1}. #{item} #{quantity}"
}.join(' ')
=> "1. apple 92 2. banana 43 3. kiwi 55"

答案 2 :(得分:0)

尝试以下操作:

a = [1, 2, 3]
b = [{:item => 'apple', :quantity => 92}, {:item => 'banana', :quantity => 43}, {:item => 'kiwi', :quantity => 55}]

a.each_with_index do |a_value, i| 
  puts "#{a_value}. #{b[i][:item]} #{b[i][:quantity]}"
end

这将输出:

1. apple 92
2. banana 43
3. kiwi 55

或者如果您希望输出类似

1. apple 92 2. banana 43 3. kiwi 55

然后您可以将地图与索引一起使用

output = a.map.with_index do |a_value, i| 
  "#{a_value}. #{b[i][:item]} #{b[i][:quantity]}"
end.join(' ')
puts output