【问题标题】:Select items from arrays of an array with certain indexes从具有特定索引的数组的数组中选择项目
【发布时间】:2017-02-08 22:13:56
【问题描述】:

我想从索引位置 0、2 和 4 的每个 arr 数组中选择项目

输入数组

arr = [
  ["name", "address", "contact", "company", "state"],
  ["n1", "add1", "c1", "cp1", "s1"],
  ["n2", "add2", "c2", "cp2", "s2"] 
]

输出数组

arr = [
  ["name", "contact", "company"],
  ["n1", "c1", "cp1"],
  ["n2", "c2", "cp2"]
]

【问题讨论】:

  • 您无法在编辑中更改整个问题!如果需要,请提出新问题。
  • new_arr = arr.collect { |item| [项目[0],项目[2],项目[3]]}?
  • 欢迎来到 Stack Overflow。请阅读“How to Ask”,包括链接页面和“minimal reproducible example”。我们真的很想看到您在询问之前尝试解决这个问题。没有它,看起来您并没有尝试并希望我们为您编写代码,这不是 Stack Overflow 的用途。 “How much research effort is expected of Stack Overflow users?”另外,您在编辑中显着改变了您的问题。不要这样做,因为您的更改会使答案与您的问题不匹配,这会使正在寻找类似答案的任何人感到困惑。

标签: arrays ruby ruby-on-rails-4


【解决方案1】:

作为删除不需要的项目的替代方法,您可以只选择需要的项目。

arr.map{|subarray| subarray.values_at(0, 2, 4) }
# => [["name", "contact", "state"], ["n1", "c1", "s1"], ["n2", "c2", "s2"]]

【讨论】:

  • 我喜欢。也许arr.map{ |sub| sub.values_at(*(0..arr.size).step(2).to_a) } 更通用。
  • @CarySwoveland:您似乎也从这种任意选择的索引中推断出一个假想的规则。虽然这个问题可以从更清晰的描述中受益,但它确实说“来自某些索引”。它没有说“来自其他所有索引”。
  • Rakesh 和我进行了一次心灵融合。实际上,我没有阅读问题,只阅读了其他答案。 ?
【解决方案2】:

如果你想让这个更通用并且只选择偶数列,你可以这样做

arr.map{|a| a.select.with_index { |e, i| i.even? }}

给了

[["name", "contact", "state"], ["n1", "c1", "s1"], ["n2", "c2", "s2"]]

【讨论】:

    【解决方案3】:

    原问题:

    我想从索引位置 1 和 5 的每个 arr 数组中删除项目

    我们可以使用delete_if 来实现这一点。这里:

    arr.map { |a| a.delete_if.with_index { |el, index| [1,5].include? index } }
    # => [["name", "contact", "company", "state"], ["n1", "c1", "cp1", "s1"], ["n2", "c2", "cp2", "s2"]]
    

    PS:关于索引 1 和 2 处的数组的输出不正确,例如删除索引 4 处的元素

    【讨论】:

    • 输出数组在我的问题中不包含“状态”
    • @RakeshPatidar 已经在我的回答中解决了这个问题。请注意,我并不是要粗鲁,但是在编辑中完全更改问题是错误的,您以后应该避免这样做。
    • 对不起@shivam,我会处理这个的。
    【解决方案4】:

    Ruby 具有非常好的解构语法,因此您可以一次性提取所有值:

    a = 0.upto(5).to_a # => [0, 1, 2, 3, 4, 5]
    x, _, y, _, z = a
    
    x # => 0
    y # => 2
    z # => 4
    

    下划线只是你不需要的值的占位符。

    【讨论】:

      【解决方案5】:

      也可以用each_slice方法执行。

      如果可以将 0、2、4 个值视为一个列表,而忽略每一个第二个值(_),则可以这样写:

      arr.map { |a| a.each_slice(2).map { |item, _| item } }
      

      【讨论】:

      • 我非常怀疑这是否是最初的意图。相反,你误解了它。你能想象一个以“好的,这是一个数据集,让我们获取其中的所有其他列,不管它是什么”开头的数据处理任务吗?
      • 感谢您指出这一点。我看到了 0、2、4 的值,并将它们视为列表,省略了每一个第二个值。
      • 是的。我刚刚这样做了。
      猜你喜欢
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2014-12-10
      • 2021-04-20
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多