从数组的数组(它只是一对元素)中Map和选择,Ruby

3yhwsihp  于 2023-03-08  发布在  Ruby
关注(0)|答案(2)|浏览(114)

我有这个数组:
[["A", 0], ["B", 0], ["b", 0], ["F", 1], ["G", 2], ["g", 3], ["C", 0]]
我想从数组对中选择它是否为0并创建一个新数组
["A","B","b",1,2,3,"C"]
我试着用

arr.each do |a| 
  if a.last == 0
    a.first
  else
    a.last
  end
end

但它返回原始数组。

fkaflof6

fkaflof61#

你真的很接近了。只需要使用map而不是eacheach只是循环通过它被调用的Enumerable并返回原始对象。map也循环通过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"]
fnx2tebb

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"]

相关问题