如果索引位置大于特定值,则删除数组元素

4
我正在尝试删除数组中索引大于某个值的元素。我想要实现类似于以下的操作:
a = ["a", "b", "c"]
b = a.delete_if {|x| x.index > 1 }

我看了一下 `drop`,`delete_if` 等方法。我试着用 `each_with_index` 做了这个操作:
new_arr = []
a.each_with_index do |obj, index|
    if index > 1
        obj.delete
    end
    new_arry << obj
end

如果数组元素的位置大于一定值,如何删除该元素?

5个回答

7
以下是返回索引大于等于index的元素被删除后的a数组的其他几种方法,可以更好地表达为“返回前index个元素”。以下所有方法都将返回["a","b"]
a = ["a", "b", "c", "d", "e"]
index = 2

非破坏性 (即,a 不会被改变)

a[0,index]
index.times.map { |i| a[i] }

破坏性操作(a 被修改或“突变”)

a.object_id #=> 70109376954280 
a = a[0,index]
a.object_id #=> 70109377839640

a.object_id #=> 70109377699700 
a.replace(a.first(index))
a.object_id #=> 70109377699700 

非常感谢您提供详细的答案,这正是我所需要的。 - Jbur43

4
你可以使用 slice! 方法并给它一个范围。由于有 !,所以这是一个破坏性方法,会改变你的数组。
a = [1, 2, 3, 4]
a.slice!(2..-1)

a = [1, 2]


3

Array#first 可以获取数组的前 n 个元素。

b = a.first(1)
# => ["a"]

如果您想以破坏性的方式进行操作,那么可以使用以下方法:
a.pop(a.length - 1)
a # => ["a"]

假设我有一个长度为20的数组,并想删除索引位置9及以上的元素?这更符合我尝试做的事情。 - Jbur43
1
我相信@sawa在写1的时候是想表达n。(s:n需要用反引号括起来。) - Cary Swoveland

2
你可以使用 with_index 方法来添加索引:
a = ["a", "b", "c"]
a.delete_if.with_index { |x, i| i > 1 }
a #=> ["a", "b"]

另一个例子:
a = ("a".."z").to_a
a.delete_if.with_index { |x, i| i.odd? }
#=> ["a", "c", "e", "g", "i", "k", "m", "o", "q", "s", "u", "w", "y"]

0
根据您的问题,“如果数组位置大于某个值,如何删除数组元素?”
我猜您想要的是最终的数组只包含指定索引之前的元素。
您可以这样做:
your_array.select { |element| your_array.index(element) < max_index }

E.g

figures = [1,2,3,4,5,6]
figures.select{ |fig| figures.index(fig) < 3 }
# => [1, 2, 3]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接