我想过滤一个二维数组,获取所需的列索引并返回一个仅包含这些列的二维数组。除了空数组外,我想返回相同的二维数组。
另外,我不想修改原始数组,我希望在编写代码时不使用任何 if 语句,或者尽可能限制分支。
我想知道 Marshal#load
和 Marshal#dump
是否多余并使用 #map!
。
我选择使用 #map!
的原因是我不必使用 if..else..end
block ,但我很好奇学习其他策略。
下面是我的解决方案:
def keep_columns args
matrix = Marshal.load Marshal.dump args[:matrix]
columns = args[:columns]
matrix.map! do |row|
row.select.with_index { |_,idx| columns.include? idx }
end unless columns.empty?
matrix
end
matrix = [['foo','bar', 'baz'],['cats', 'and', 'dogs']]
keep_columns matrix: matrix, columns: [0,2]
#=> [["foo", "baz"], ["cats", "dogs"]]
keep_columns matrix: matrix, columns: []
#=> [["foo", "bar", "baz"], ["cats", "and", "dogs"]]
最佳答案
你可以使用 Array#transpose前后Hash#values_at .
def extract_columns(arr, columns)
return arr if columns.empty?
arr.transpose.values_at(*columns).transpose
end
arr = [['foo','bar', 'baz'],['cats', 'and', 'dogs']]
extract_columns(arr, [0, 2])
#=> [["foo", "baz"], ["cats", "dogs"]]
extract_columns(arr, [])
#=> [["foo", "bar", "baz"], ["cats", "and", "dogs"]]
请注意,arr
没有被修改。
关于arrays - 过滤二维数组没有副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41773244/