javascriptarraysprepend

Most efficient way to prepend a value to an array


Assuming I have an array that has a size of N (where N > 0), is there a more efficient way of prepending to the array that would not require O(N + 1) steps?

In code, essentially, what I currently am doing is

function prependArray(value, oldArray) {
  var newArray = new Array(value);

  for(var i = 0; i < oldArray.length; ++i) {
    newArray.push(oldArray[i]);
  }

  return newArray;
}

Solution

  • I'm not sure about more efficient in terms of big-O but certainly using the unshift method is more concise:

    var a = [1, 2, 3, 4];
    a.unshift(0);
    // => [0, 1, 2, 3, 4]
    console.log({a});

    [Edit]

    This jsPerf benchmark shows that unshift is decently faster in at least a couple of browsers, regardless of possibly different big-O performance if you are ok with modifying the array in-place. If you really can't mutate the original array then you would do something like the below snippet, which doesn't seem to be appreciably faster than your solution:

    a.slice().unshift(0); // Use "slice" to avoid mutating "a".
    

    [Edit 2]

    For completeness, the following function can be used instead of OP's example prependArray(...) to take advantage of the Array unshift(...) method:

    function prepend(value, array) {
      var newArray = array.slice();
      newArray.unshift(value);
      return newArray;
    }
    
    var x = [1, 2, 3];
    var y = prepend(0, x);
    // x => [1, 2, 3];
    // y => [0, 1, 2, 3];
    console.log({ x, y });