arrays - 过滤二维数组没有副作用

标签 arrays ruby multidimensional-array

我想过滤一个二维数组,获取所需的列索引并返回一个仅包含这些列的二维数组。除了空数组外,我想返回相同的二维数组。

另外,我不想修改原始数组,我希望在编写代码时不使用任何 if 语句,或者尽可能限制分支。

我想知道 Marshal#loadMarshal#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/

相关文章:

JavaScript 初始化/追加/更新数组数组

c# - 为什么这个多维数组会得到 "object reference error"?

javascript - 使用 .filter 搜索数组

php - 对于我循环 PHP MYSQL

Ruby - 用于确定对象是否包含在列表中的替代样式?

c - Ruby C 扩展 - 64 位指针被截断导致段错误

javascript - 如何使用 JavaScript 刷新 div?

python - 在python中通过其索引和数组切片数据框

ruby - 为什么 Ruby 的 Win32Console 不适用于 Ramaze?

c++ - 指向二维数组的指针的 C/C++ 数组