我看到的所有创建子数组的文档都在谈论 slice
,它创建数组的副本。我想知道是否可以在不复制的情况下创建一个数组的切片,以便修改切片会修改原始数组。例如:
var foo = [1, 2, 3, 4, 5];
var bar = foo.subarray(2, 4);
console.log(bar); // [2, 3, 4]
bar[0] = 'hello, world';
console.log(bar); // ['hello, world', 3, 4]
console.log(foo); // [1, 'hello, world', 3, 4, 5]
最佳答案
不幸的是,@Derek 的回答需要 O(n)
创建长度为 n
的子数组,而我们可以在 O(1)
中做到这一点如果我们使用 subarray.get(i)
访问值而不是 subarry[i]
:
function make_subarray (array, from, to) {
return {
get: function (i) {
return array[i+from]
},
length: to - from
}
}
你可以这样使用:
for (var i=0; i<subarray.length; i++) {
subarray.get(i)
}
或者您可以添加 map()
功能到subarray
定义:
function make_subarray (array, from, to) {
return {
...
map: function (f) {
for (var i=0; i<this.length; i++)
f(this.get(i))
}
...
}
}
每次调用 Object.defineProperty(...{get: ...})
在 Derek 的回答中,在现代浏览器中速度很慢,所以最好避免做太多。
关于没有复制的 JavaScript 子数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24065411/