没有复制的 JavaScript 子数组?

标签 javascript arrays

我看到的所有创建子数组的文档都在谈论 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/

相关文章:

javascript - 关联 2 个数组之间的项目

javascript - 如何显示 DOM 元素

javascript - 迭代 BasicPrimitives OrgChart 项目

javascript - iOS 上的 Photoswipe 图库关闭事件

javascript - 取消选中复选框并修改总计 - JS

javascript - 设置 WebSocket 编码

c# - 在 wpf C# 中使用点访问二维数组

java - 如何从 Java 中的 List<String[]> 获取具有频率的唯一值?

javascript - D3 从包含名称的字符串数组创建按钮

javascript - 使用 PHP 中的 JSON 进行 JSON 解析