我有以下数组,其中包含1到10之间的所有数字:
numbers = [1,2,3,4,5,6,7,8,9,10]
我希望将每个偶数索引元素乘以2,将每个奇数索引元素乘以3.我希望我的数组看起来像:
[2,6,6,12,10,18,14,24,18,30]
我尝试了以下解决方案:
numbers.select do |x|
if x.even?
x * 2
else
x * 3
end
puts x
end
不幸的是,这不起作用。有没有人有更好的方法?
答案 0 :(得分:3)
看起来你希望每个偶数索引乘以2,奇数索引乘以3。
这应该可以解决问题
numbers = [1,2,3,4,5,6,7,8,9,10]
numbers.map!.with_index { |n, i| i.even? ? n * 2 : n * 3 }
p numbers
# => [2,6,6,12,10,18,14,24,18,30]
对于您的尝试,只要块的结果为true,#select
就会从枚举器中选择元素。如果要修改枚举器,则应使用#map!
。 #with_index
方法可供所有枚举器使用,以在块中包含索引。
答案 1 :(得分:3)
numbers.map.with_index { |n, i| n * (i.even? ? 2 : 3) }
=> [2, 6, 6, 12, 10, 18, 14, 24, 18, 30]
答案 2 :(得分:1)
您的区块不是返回x * 2或x * 3,而是puts x
的结果。您需要删除该行的这一行。
答案 3 :(得分:0)
Array#select
根据块中代码的评估过滤数组。如果块返回“truthy”值(任何不是false
或nil
的值),则保留该元素,否则将其丢弃。
你想要的是map
方法。 map
返回一个由块返回填充的新数组。
[1,2,3,4,5,6,7,8,9,10].map { |x| x.even? ? x * 2 : x * 3 }
答案 4 :(得分:0)
稍微打高尔夫球:
numbers = [1,2,3,4,5,6,7,8,9,10]
puts numbers.each_with_index.map{|n, i| n * (2 + i % 2) }
答案 5 :(得分:0)
以下是使用cycle
的方法:
multiply_by = [2, 3].cycle
numbers.map { |n| n * multiply_by.next }
# => [2, 6, 6, 12, 10, 18, 14, 24, 18, 30]
答案 6 :(得分:0)
这是JavaScript中的解决方案。
function ModifyArray(nums){ 返回nums.map(num => num%2 == 0?num * 2:num * 3) }