JavaScript subarray without copying?

arrays, javascript

Solution

Unfortunately, @Derek's answer takes `O(n)` to create a subarray of length `n`, whereas we can do it in `O(1)` if we access values with `subarray.get(i)` instead of `subarry[i]`:

function make_subarray (array, from, to) {
   return {
      get: function (i) {
          return array[i+from]
      },
      length: to - from
   }
}

You would use this like:

for (var i=0; i<subarray.length; i++) {
    subarray.get(i)
}

Or you can add a `map()` function to the `subarray` definition:

function make_subarray (array, from, to) {
   return {
      ...
      map: function (f) {
         for (var i=0; i<this.length; i++)
            f(this.get(i))
      }
      ...
   }
}

Each call to `Object.defineProperty(...{get: ...})` in Derek's answer is slow in modern browsers, so it's good to avoid doing a lot of them.

Problem

All of the documentation for creating sub-arrays I've seen talks about `slice`, which creates a copy of the array. I'm wondering if it's possible to create a slice of an array without copying, so that modifying the slice modifies the original array. For example: ``` 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] ```

Original source