我有这个数组:[["A", 0], ["B", 0], ["b", 0], ["F", 1], ["G", 2], ["g", 3], ["C", 0]]我想从数组对中选择它是否为0并创建一个新数组["A","B","b",1,2,3,"C"]我试着用
[["A", 0], ["B", 0], ["b", 0], ["F", 1], ["G", 2], ["g", 3], ["C", 0]]
["A","B","b",1,2,3,"C"]
arr.each do |a| if a.last == 0 a.first else a.last end end
但它返回原始数组。
fkaflof61#
你真的很接近了。只需要使用map而不是each。each只是循环通过它被调用的Enumerable并返回原始对象。map也循环通过Enumerable,但返回那些迭代的结果值的Array。若要传递一个与最后一个命令的返回值不同的值作为迭代块的结果值,请使用next。调用next value将停止处理当前以value作为结果的循环。您的工作代码是:
map
each
Enumerable
Array
next
next value
value
arr = [["A", 0], ["B", 0], ["b", 0], ["F", 1], ["G", 2], ["g", 3], ["C", 0]] new_arr = arr.map do |a| if a.last == 0 a.first else a.last end end #=> ["A", "B", "b", 1, 2, 3, "C"]
使用next的代码示例
arr = [["A", 0], ["B", 0], ["b", 0], ["F", 1], ["G", 2], ["g", 3], ["C", 0]] new_arr = arr.map do |a| next a.first if a.last == 0 a.last end #=> ["A", "B", "b", 1, 2, 3, "C"]
fnx2tebb2#
除了#each甚至map之外,您还可以使用#each_with_object,您可以传入您选择任何对象,但听起来您需要的是一个数组,下面是一个示例
new_array = input.each_with_object([]) do |a, arr| # the second value `arr` passed to the block is the [] arr << if a.last.zero? a.first else a.last end end #=> ["A", "B", "b", 1, 2, 3, "C"]
2条答案
按热度按时间fkaflof61#
你真的很接近了。只需要使用
map
而不是each
。each
只是循环通过它被调用的Enumerable
并返回原始对象。map
也循环通过Enumerable
,但返回那些迭代的结果值的Array
。若要传递一个与最后一个命令的返回值不同的值作为迭代块的结果值,请使用
next
。调用next value
将停止处理当前以value
作为结果的循环。您的工作代码是:
使用
next
的代码示例fnx2tebb2#
除了#each甚至map之外,您还可以使用#each_with_object,您可以传入您选择任何对象,但听起来您需要的是一个数组,下面是一个示例