2049

I have a need to add or prepend elements at the beginning of an array.

For example, if my array looks like below:

[23, 45, 12, 67]

And the response from my AJAX call is 34, I want the updated array to be like the following:

[34, 23, 45, 12, 67]

Currently I am planning to do it like this:

var newArray = [];
newArray.push(response);

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

theArray = newArray;
delete newArray;

Is there a better way to do this? Does JavaScript have any built-in functionality that does this?

The complexity of my method is O(n) and it would be really interesting to see better implementations.

Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
Moon
  • 30,393
  • 17
  • 77
  • 125
  • 20
    FYI: If you need to continuously insert an element at the beginning of an array, it is faster to use `push` statements followed by a call to `reverse`, instead of calling `unshift` all the time. – Krisztián Balla Feb 15 '18 at 08:56
  • 2
    @JennyO'Reilly you should post this as an answer. Matched my use-case perfectly. thanks – rob Jun 07 '18 at 12:19
  • 2
    Performance tests: https://jsperf.com/adding-element-to-the-array-start But the results are different for each browser. – Avernikoz Apr 23 '19 at 18:34

14 Answers14

3461

Use unshift. It's like push, except it adds elements to the beginning of the array instead of the end.

  • unshift/push - add an element to the beginning/end of an array
  • shift/pop - remove and return the first/last element of an array

A simple diagram...

   unshift -> [array] <- push
   shift   <- [array] -> pop
 

and chart:

          add  remove  start  end
   push    X                   X
    pop           X            X
unshift    X             X
  shift           X      X

Check out the MDN Array documentation. Virtually every language that has the ability to push/pop elements from an array will also have the ability to unshift/shift (sometimes called push_front/pop_front) elements, you should never have to implement these yourself.


As pointed out in the comments, if you want to avoid mutating your original array, you can use concat, which concatenates two or more arrays together. You can use this to functionally push a single element onto the front or back of an existing array; to do so, you need to turn the new element into a single element array:

const array = [3, 2, 1]

const newFirstElement = 4

const newArray = [newFirstElement].concat(array) // [ 4, 3, 2, 1 ]

console.log(newArray);

concat can also append items. The arguments to concat can be of any type; they are implicitly wrapped in a single-element array, if they are not already an array:

const array = [3, 2, 1]

const newLastElement = 0

// Both of these lines are equivalent:
const newArray1 = array.concat(newLastElement) // [ 3, 2, 1, 0 ]
const newArray2 = array.concat([newLastElement]) // [ 3, 2, 1, 0 ]

console.log(newArray1);
console.log(newArray2);
Mak
  • 18,924
  • 5
  • 24
  • 31
user229044
  • 222,134
  • 40
  • 319
  • 330
  • 62
    Using `concat` might be preferable as it returns the new array. Very useful for chaining. `[thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)` etc... If you use `unshift`, you can't do that chaining because all you get back is the length. – StJohn3D Sep 23 '16 at 18:27
  • 8
    shift/unshift, push/pop, splice. Very logical names for such methods. – linuxunil Apr 25 '18 at 12:32
  • This one of the most easy to understand answers that I ever seen. Congrats for that. – WitaloBenicio Apr 12 '22 at 13:21
1601

array operations image

var a = [23, 45, 12, 67];
a.unshift(34);
console.log(a); // [34, 23, 45, 12, 67]
Ruslan López
  • 4,289
  • 1
  • 25
  • 36
Mak
  • 18,924
  • 5
  • 24
  • 31
  • 175
    The reason why people need a visual guideline for 4 everyday used functions is because of the encrypted function names... Why is unshift not called Insert? Shift should be Remove. etc... – Pascal Jun 29 '13 at 21:24
  • 95
    **//Why is unshift not called Insert?//** It comes from the conventions of the C programming language where array elements were treated like a stack. (see http://www.perlmonks.org/?node_id=613129 for a complete explanation) – dreftymac Jul 26 '13 at 21:05
  • 36
    @Pascal No, insert and remove would be particularly bad names for this; they imply random access, instead of adding/removing from the front of the array – user229044 Oct 22 '13 at 13:06
  • 29
    I would have thought that unshift should remove the first key, and shift would insert at the first key, but that's just my general thought – Shannon Hochkins Sep 25 '14 at 01:50
  • 6
    Mind that `[23, 45, 12, 67].unshift(34)` will not work. The Array **must** first be saved inside a variable, because `unshift` **itself** returns a value. – vsync Mar 15 '17 at 15:12
321

With ES6, use the spread operator ...:

Demo

var arr = [23, 45, 12, 67];
arr = [34, ...arr]; // RESULT : [34,23, 45, 12, 67]

console.log(arr)
Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
Abdennour TOUMI
  • 76,783
  • 33
  • 229
  • 231
  • 31
    also creates a new array, useful for pure functions – devonj Aug 08 '17 at 19:01
  • 1
    what is the performance implication here? Is it slower than using unshift()? – Peter T. Mar 02 '18 at 09:49
  • 1
    Sure, it will be slower since it is an immutable array ( creating a new array). If you are working with a big array or the performance is your first requirement, please consider to use `concat` instead. – Abdennour TOUMI Mar 02 '18 at 15:42
  • performance is not important in 2018, new versions in browser and node get the same performance – stackdave Jul 16 '18 at 06:11
  • 1
    @AbdennourTOUMI Just to clarify your comment. It is not creating an immutable array, it is just creating a new array without mutating the existing one. – Flimm Nov 11 '21 at 11:38
89

Another way to do that is through concat:

var arr = [1, 2, 3, 4, 5, 6, 7];
console.log([0].concat(arr));

The difference between concat and unshift is that concat returns a new array. The performance between them could be found here.

function fn_unshift() {
  arr.unshift(0);
  return arr;
}

function fn_concat_init() {
  return [0].concat(arr)
}

Here is the test result:

Enter image description here

Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
zangw
  • 37,361
  • 17
  • 142
  • 172
51

Quick Cheatsheet:

The terms shift/unshift and push/pop can be a bit confusing, at least to folks who may not be familiar with programming in C.

If you are not familiar with the lingo, here is a quick translation of alternate terms, which may be easier to remember:

* array_unshift()  -  (aka Prepend ;; InsertBefore ;; InsertAtBegin )     
* array_shift()    -  (aka UnPrepend ;; RemoveBefore  ;; RemoveFromBegin )

* array_push()     -  (aka Append ;; InsertAfter   ;; InsertAtEnd )     
* array_pop()      -  (aka UnAppend ;; RemoveAfter   ;; RemoveFromEnd ) 
dreftymac
  • 29,742
  • 25
  • 114
  • 177
26

Using ES6 destructuring (avoiding mutation off the original array):

const newArr = [item, ...oldArr]

Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
Ben Adam
  • 475
  • 5
  • 4
  • 5
    Essentially a duplicate answer of [the one by Abdennour TOUMI](https://stackoverflow.com/a/39531492/1578604)... – Jerry Jul 14 '20 at 08:08
25

Without Mutating

Actually, all unshift/push and shift/pop mutate the source array.

The unshift/push add an item to the existed array from begin/end and shift/pop remove an item from the beginning/end of an array.

But there are few ways to add items to an array without a mutation. the result is a new array, to add to the end of array use below code:

const originArray = ['one', 'two', 'three'];
const newItem = 4;

const newArray = originArray.concat(newItem); // ES5
const newArray2 = [...originArray, newItem]; // ES6+

To add to begin of original array use below code:

const originArray = ['one', 'two', 'three'];
const newItem = 0;

const newArray = (originArray.slice().reverse().concat(newItem)).reverse(); // ES5
const newArray2 = [newItem, ...originArray]; // ES6+

With the above way, you add to the beginning/end of an array without a mutation.

kabirbaidhya
  • 2,944
  • 2
  • 33
  • 52
AmerllicA
  • 23,670
  • 12
  • 111
  • 138
24

You have an array: var arr = [23, 45, 12, 67];

To add an item to the beginning, you want to use splice:

var arr = [23, 45, 12, 67];
arr.splice(0, 0, 34)
console.log(arr);
Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
ozimax06
  • 356
  • 2
  • 15
17

Cheatsheet to prepend new element(s) into the array

1. Array#unshift

const list = [23, 45, 12, 67];

list.unshift(34);

console.log(list); // [34, 23, 45, 12, 67];

2. Array#splice

const list = [23, 45, 12, 67];

list.splice(0, 0, 34);

console.log(list); // [34, 23, 45, 12, 67];

3. ES6 spread...

const list = [23, 45, 12, 67];
const newList = [34, ...list];

console.log(newList); // [34, 23, 45, 12, 67];

4. Array#concat

const list = [23, 45, 12, 67];
const newList = [32].concat(list);

console.log(newList); // [34, 23, 45, 12, 67];

Note: In each of these examples, you can prepend multiple items by providing more items to insert.

kabirbaidhya
  • 2,944
  • 2
  • 33
  • 52
8

If you need to continuously insert an element at the beginning of an array, it is faster to use push statements followed by a call to reverse, instead of calling unshift all the time.

Benchmark test: http://jsben.ch/kLIYf

Krisztián Balla
  • 17,664
  • 13
  • 63
  • 76
8

Using splice we insert an element to an array at the begnning:

arrName.splice( 0, 0, 'newName1' );
Itay Grudev
  • 6,684
  • 4
  • 50
  • 84
Srikrushna
  • 3,486
  • 1
  • 34
  • 44
6

If you want to push elements that are in an array at the beginning of your array, use <func>.apply(<this>, <Array of args>):

const arr = [1, 2];
arr.unshift.apply(arr, [3, 4]);
console.log(arr); // [3, 4, 1, 2]
Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
Sky Voyager
  • 11,413
  • 4
  • 45
  • 70
1

let arr = [5, 6];

// using unshift
arr.unshift(4);
console.log('arr : ', arr);

// using spread operator 
arr = [3, ...arr];
console.log('arr : ', arr);

// using concat
arr = [2].concat(arr);
console.log('arr : ', arr);

// using splice
arr.splice(0, 0, 1)
console.log('arr : ', arr);
Sahil Thummar
  • 904
  • 5
  • 8
0

There are a couple of ways to achieve this:

  1. Using shift (mutable)

const num = 1;
const arr = [2, 3];
arr.unshift(num);
console.log(arr);
  1. Using ES6 destructuring (immutable)

const num = 1;
const arr = [2, 3];
const newArr = [num, ...arr];
console.log(newArr);
  1. Using Array.prototype.concat (immutable)

const num = 1;
const arr = [2, 3];
const newArr = [num].concat(arr);
console.log(newArr);
Ran Turner
  • 8,973
  • 3
  • 23
  • 37