一位朋友问我Ruby在Ruby中实现JavaScript splice
方法效果的最佳和最佳方式。
这意味着不会对阵列本身或副本进行迭代。
“从索引开始处开始,删除长度项目和(可选)插入元素。最后在数组中返回已删除的项目。” << 这是误导性的,请参阅下面的JS示例。
http://www.mennovanslooten.nl/blog/post/41
没有可选替换的快速黑客:
from_index = 2
for_elements = 2
sostitute_with = :test
initial_array = [:a, :c, :h, :g, :t, :m]
# expected result: [:a, :c, :test, :t, :m]
initial_array[0..from_index-1] + [sostitute_with] + initial_array[from_index + for_elements..-1]
你的是什么? 一条线更好。
更新
// JavaScript
var a = ['a', 'c', 'h', 'g', 't', 'm'];
var b = a.splice(2, 2, 'test');
> b is now ["h", "g"]
> a is now ["a", "c", "test", "t", "m"]
我需要生成的'a'数组,而不是'b'。
答案 0 :(得分:7)
使用Array#[]=
。
a = [1, 2, 3, 4, 5, 6]
a[2..4] = [:foo, :bar, :baz, :wibble]
a # => [1, 2, :foo, :bar, :baz, :wibble, 6]
# It also supports start/length instead of a range:
a[0, 3] = [:a, :b]
a # => [:a, :b, :bar, :baz, :wibble, 6]
至于返回删除的元素,[]=
不会这样做......你可以编写自己的帮助方法来执行此操作:
class Array
def splice(start, len, *replace)
ret = self[start, len]
self[start, len] = replace
ret
end
end
答案 1 :(得分:3)
首先使用slice!
提取要删除的部分:
a = [1, 2, 3, 4]
ret = a.slice!(2,2)
[1,2]
中的a
和[3,4]
中的ret
。然后是一个简单的[]=
来插入新值:
a[2,0] = [:pancakes]
结果是[3,4]
中的ret
和[1, 2, :pancakes]
中的a
。泛化:
def splice(a, start, len, replacements = nil)
r = a.slice!(start, len)
a[start, 0] = replacements if(replacements)
r
end
如果您想要可变行为,也可以使用*replacements
:
def splice(a, start, len, *replacements)
r = a.slice!(start, len)
a[start, 0] = replacements if(replacements)
r
end
使用start
和len
进行修补并确定您想要解决的有关出界问题的内容是留作练习。