1201

I have a JavaScript array dataArray which I want to push into a new array newArray. Except I don't want newArray[0] to be dataArray. I want to push in all the items into the new array:

var newArray = [];

newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...

or even better:

var newArray = new Array (
   dataArray1.values(),
   dataArray2.values(),
   // ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);

So now the new array contains all the values of the individual data arrays. Is there some shorthand like pushValues available so I don't have to iterate over each individual dataArray, adding the items one by one?

IARI
  • 1,217
  • 1
  • 18
  • 35
bba
  • 14,621
  • 11
  • 29
  • 26
  • See this url http://stackoverflow.com/questions/351409/appending-to-array – Jakir Hossain Jan 10 '16 at 10:50
  • This should be the answer https://davidwalsh.name/combining-js-arrays – starikovs Sep 22 '17 at 08:24
  • Does this answer your question? [How to merge two arrays in JavaScript and de-duplicate items](https://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript-and-de-duplicate-items) – HackerMan Jan 15 '20 at 07:06

20 Answers20

1566

Use the concat function, like so:

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayA.concat(arrayB);

The value of newArray will be [1, 2, 3, 4] (arrayA and arrayB remain unchanged; concat creates and returns a new array for the result).

Zsolt Meszaros
  • 21,961
  • 19
  • 54
  • 57
WiseGuyEh
  • 18,584
  • 1
  • 20
  • 20
  • 19
    I agree that performant execution is very nice. **BUT** isn't concat exactly for **that** purpose to _concat_ to arrays? So it should be **standard**. Or is there other better things to do with concat? And it might be slow only because of bad implementation of the JS engine of the browser or wherever you're using it in? It might be fixed one day. I would choose code maintainability over hacky speed optimizations. Hmm .... – Bitterblue Jun 10 '16 at 09:04
  • 7
    Also I just benchmarked the situation: concat vs. push.apply. `Google Chrome`: fast (concat = winner), `Opera`: fast (concat = winner), `IE`: slower (concat = winner), `Firefox`: slow (push.apply = winner, yet 10 times slower than Chrome's concat) ... speak of bad JS engine implementation. – Bitterblue Jun 10 '16 at 09:25
  • 50
    How is _concatenating_ two arrays the accepted answer for how to _push_ one into another?! Those are two different operations. – kaqqao Mar 06 '17 at 19:18
  • 3
    @kaqqao because `push` doesn't won't flatten an array of values. `concat` achieves what the question requires. – WiseGuyEh Mar 06 '17 at 20:26
  • 5
    @WiseGuyEh Imagine this: `function(stuff, toAdd) {stuff.push(toAdd);}` There's no way to use `concat` here. That's what I meant by them not being interchangeable. And why I believe `Array.prototype.push.apply(stuff, toAdd);` is the correct answer. – kaqqao Mar 06 '17 at 21:25
  • 2
    @kaqqao The question ideally asks for a new array to be created from two input arrays, the above answer achieves this. The title of the question perhaps is misleading.. – WiseGuyEh Mar 06 '17 at 21:51
  • concat is different than push because it doesn't allow you to work with the reference like push does – bmpasini Jan 31 '18 at 15:58
  • 1
    Reading the title I also thought that the OP wanted what @kaqqao said - I really think the Title of Original question should be changed then. – IARI Apr 25 '19 at 11:07
  • With modern javascript in 2022, the best answer is the second most upvoted answer to this question, which is to use the spread operator `array1.push(...array2);` https://stackoverflow.com/a/30846567/6665383 – Nathan Loyer Jul 27 '22 at 23:25
810

In ECMAScript 6, you can use the Spread syntax:

let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);

console.log(arr1)

Spread syntax is available in all major browsers (that excludes IE11). For the current compatibility, see this (continuously updated) compatibility table.

However, see Jack Giffin's reply below for more comments on performance. It seems concat is still better and faster than the spread operator.

Dan Dascalescu
  • 143,271
  • 52
  • 317
  • 404
Karel Bílek
  • 36,467
  • 31
  • 94
  • 149
  • 11
    You can also use the spread operator if you are using TypeScript. If you target ES5, it will compile to `newArray.apply(newArray, dataArray1)`. – AJ Richardson Feb 26 '16 at 21:28
  • 11
    Note: if you need the result in a third array (thus not modifying arr1, as the initial question seemed to require), you can do newArray = [...arr1, ...arr2] – dim Sep 29 '17 at 19:42
  • Similar to how concat would function then, with the bonus of being persistent (mutating the original array). – Rob Sep 01 '18 at 08:37
  • @robertmylne The spread operator obviously does not modify the original array, instead creating a new copy of all the arrays contents desparsed. – Jack G Nov 20 '18 at 02:44
  • Incidentally, this is also blazingly fast compared to other methods of copying one array's contents into another. – Engineer Dec 28 '19 at 13:38
  • If you pass many elements using spread operator, you will run into a `maximum call stack error`, as you will be basically calling a function with an enormous number of arguments. – Steven Spungin Sep 06 '22 at 21:52
684

Provided your arrays are not huge (see caveat below), you can use the push() method of the array to which you wish to append values. push() can take multiple parameters so you can use its apply() method to pass the array of values to be pushed as a list of function parameters. This has the advantage over using concat() of adding elements to the array in place rather than creating a new array.

However, it seems that for large arrays (of the order of 100,000 members or more), this trick can fail. For such arrays, using a loop is a better approach. See https://stackoverflow.com/a/17368101/96100 for details.

var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);

You might want to generalize this into a function:

function pushArray(arr, arr2) {
    arr.push.apply(arr, arr2);
}

... or add it to Array's prototype:

Array.prototype.pushArray = function(arr) {
    this.push.apply(this, arr);
};

var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);

... or emulate the original push() method by allowing multiple parameters using the fact that concat(), like push(), allows multiple parameters:

Array.prototype.pushArray = function() {
    this.push.apply(this, this.concat.apply([], arguments));
};

var newArray = [];
newArray.pushArray(dataArray1, dataArray2);

Here's a loop-based version of the last example, suitable for large arrays and all major browsers, including IE <= 8:

Array.prototype.pushArray = function() {
    var toPush = this.concat.apply([], arguments);
    for (var i = 0, len = toPush.length; i < len; ++i) {
        this.push(toPush[i]);
    }
};
Community
  • 1
  • 1
Tim Down
  • 318,141
  • 75
  • 454
  • 536
  • 10
    note: `newArray.push.apply(newArray, dataArray1);` gives the same as `Array.prototype.push.applay(newArray,dataArra1);` –  Jul 05 '13 at 11:02
  • Is this compatible with older browsers? – Damien Apr 06 '18 at 00:53
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply – Damien Apr 06 '18 at 00:53
  • 1
    @DamienÓCeallaigh: Yes. This is all compatible with browsers going back to IE 6 and even earlier. – Tim Down Apr 09 '18 at 11:16
  • This is the epitome of poor programming practices. `Array.prototype.concat` is not bad, rather it is simply misunderstood and sometimes misused. Under these circumstances, it is only misunderstood, but not misused. – Jack G Aug 15 '18 at 10:23
  • @JackGiffin: Strong words but I'm not at all clear on what you're objecting to. – Tim Down Aug 15 '18 at 15:40
  • @JackGiffin: Firstly, as I understand it, your main objection is performance. It's certainly possible `concat` is faster than `push`. Whether this is actually important depends entirely on context (for most of the projects I work on, it wouldn't be. YMMV.) Secondly, the question is slightly ambiguous but it looked to me on first reading as though the OP wanted to append the contents of one array to the end of an existing array, preserving the original array rather than creating a new one. Reading it again now, I think that `concat` and creating a new array is probably fine. – Tim Down Nov 20 '18 at 15:36
  • @TimDown Thanks. I definitely agree that it depends on the context. My response only pertained to the circumstances of creating a new array. If your code permits you to modify an existing array, then `push.apply` is much much faster than `concat`. To be honest, I have written like hundreds of thousands of lines of practical javascript code; yet, I have yet to find a single real world scenario where it could be more performant to create a new array than to modify an existing array. – Jack G Nov 22 '18 at 14:07
  • 7
    Now with the spread operator this can be simplified like so `array.push(...array2);` – Moshe Sommers Dec 10 '19 at 15:54
163

Found an elegant way from MDN

var vegetables = ['parsnip', 'potato'];
var moreVegs = ['celery', 'beetroot'];

// Merge the second array into the first one
// Equivalent to vegetables.push('celery', 'beetroot');
Array.prototype.push.apply(vegetables, moreVegs);

console.log(vegetables); // ['parsnip', 'potato', 'celery', 'beetroot']

Or you can use the spread operator feature of ES6:

let fruits = [ 'apple', 'banana'];
const moreFruits = [ 'orange', 'plum' ];

fruits.push(...moreFruits); // ["apple", "banana", "orange", "plum"]
Believe2014
  • 3,894
  • 2
  • 26
  • 46
  • 2
    This is not what the question was asking for. The question is asking for a way to create a new array each time, not modify an old array. – Jack G Aug 15 '18 at 09:16
22

(for the original question)

For the facts, a performance test at jsperf and checking some things in the console are performed. For the research, the website irt.org is used. Below is a collection of all these sources put together plus an example function at the bottom.

╔═══════════════╦══════╦═════════════════╦═══════════════╦═════════╦══════════╗
║ Method        ║Concat║slice&push.apply ║ push.apply x2 ║ ForLoop ║Spread    ║
╠═══════════════╬══════╬═════════════════╬═══════════════╬═════════╬══════════╣
║ mOps/Sec      ║179   ║104              ║ 76            ║ 81      ║28        ║
╠═══════════════╬══════╬═════════════════╬═══════════════╬═════════╬══════════╣
║ Sparse arrays ║YES!  ║Only the sliced  ║ no            ║ Maybe2   ║no        ║
║ kept sparse   ║      ║array (1st arg)  ║               ║         ║          ║
╠═══════════════╬══════╬═════════════════╬═══════════════╬═════════╬══════════╣
║ Support       ║MSIE 4║MSIE 5.5         ║ MSIE 5.5      ║ MSIE 4  ║Edge 12   ║
║ (source)      ║NNav 4║NNav 4.06        ║ NNav 4.06     ║ NNav 3  ║MSIE NNav ║
╠═══════════════╬══════╬═════════════════╬═══════════════╬═════════╬══════════╣
║Array-like acts║no    ║Only the pushed  ║ YES!          ║ YES!    ║If have   ║
║like an array  ║      ║array (2nd arg)  ║               ║         ║iterator1  ║
╚═══════════════╩══════╩═════════════════╩═══════════════╩═════════╩══════════╝
1 If the array-like object does not have a Symbol.iterator property, then trying
  to spread it will throw an exception.
2 Depends on the code. The following example code "YES" preserves sparseness.
function mergeCopyTogether(inputOne, inputTwo){
   var oneLen = inputOne.length, twoLen = inputTwo.length;
   var newArr = [], newLen = newArr.length = oneLen + twoLen;
   for (var i=0, tmp=inputOne[0]; i !== oneLen; ++i) {
        tmp = inputOne[i];
        if (tmp !== undefined || inputOne.hasOwnProperty(i)) newArr[i] = tmp;
    }
    for (var two=0; i !== newLen; ++i, ++two) {
        tmp = inputTwo[two];
        if (tmp !== undefined || inputTwo.hasOwnProperty(two)) newArr[i] = tmp;
    }
    return newArr;
}

As seen above, I would argue that Concat is almost always the way to go for both performance and the ability to retain the sparseness of spare arrays. Then, for array-likes (such as DOMNodeLists like document.body.children), I would recommend using the for loop because it is both the 2nd most performant and the only other method that retains sparse arrays. Below, we will quickly go over what is meant by sparse arrays and array-likes to clear up confusion.

At first, some people may think that this is a fluke and that browser vendors will eventually get around to optimizing Array.prototype.push to be fast enough to beat Array.prototype.concat. WRONG! Array.prototype.concat will always be faster (in principle at least) because it is a simple copy-n-paste over the data. Below is a simplified persuado-visual diagram of what a 32-bit array implementation might look like (please note real implementations are a LOT more complicated)

Byte ║ Data here
═════╬═══════════
0x00 ║ int nonNumericPropertiesLength = 0x00000000
0x01 ║ ibid
0x02 ║ ibid
0x03 ║ ibid
0x00 ║ int length = 0x00000001
0x01 ║ ibid
0x02 ║ ibid
0x03 ║ ibid
0x00 ║ int valueIndex = 0x00000000
0x01 ║ ibid
0x02 ║ ibid
0x03 ║ ibid
0x00 ║ int valueType = JS_PRIMITIVE_NUMBER
0x01 ║ ibid
0x02 ║ ibid
0x03 ║ ibid
0x00 ║ uintptr_t valuePointer = 0x38d9eb60 (or whereever it is in memory)
0x01 ║ ibid
0x02 ║ ibid
0x03 ║ ibid

As seen above, all you need to do to copy something like that is almost as simple as copying it byte for byte. With Array.prototype.push.apply, it is a lot more than a simple copy-n-paste over the data. The ".apply" has to check each index in the array and convert it to a set of arguments before passing it to Array.prototype.push. Then, Array.prototype.push has to additionally allocate more memory each time, and (for some browser implementations) maybe even recalculate some position-lookup data for sparseness.

An alternative way to think of it is this. The source array one is a large stack of papers stapled together. The source array two is also another large stack of papers. Would it be faster for you to

  1. Go to the store, buy enough paper needed for a copy of each source array. Then put each source array stacks of paper through a copy-machine and staple the resulting two copies together.
  2. Go to the store, buy enough paper for a single copy of the first source array. Then, copy the source array to the new paper by hand, ensuring to fill in any blank sparse spots. Then, go back to the store, buy enough paper for the second source array. Then, go through the second source array and copy it while ensuring no blank gaps in the copy. Then, staple all the copied papers together.

In the above analogy, option #1 represents Array.prototype.concat while #2 represents Array.prototype.push.apply. Let us test this out with a similar JSperf differing only in that this one tests the methods over sparse arrays, not solid arrays. One can find it right here.

Therefore, I rest my case that the future of performance for this particular use case lies not in Array.prototype.push, but rather in Array.prototype.concat.

When certain members of the array are simply missing. For example:

// This is just as an example. In actual code, 
// do not mix different types like this.
var mySparseArray = [];
mySparseArray[0] = "foo";
mySparseArray[10] = undefined;
mySparseArray[11] = {};
mySparseArray[12] =  10;
mySparseArray[17] = "bar";
console.log("Length:   ", mySparseArray.length);
console.log("0 in it:  ", 0 in mySparseArray);
console.log("arr[0]:   ", mySparseArray[0]);
console.log("10 in it: ", 10 in mySparseArray);
console.log("arr[10]   ", mySparseArray[10]);
console.log("20 in it: ", 20 in mySparseArray);
console.log("arr[20]:  ", mySparseArray[20]);

Alternatively, javascript allows you to initialize spare arrays easily.

var mySparseArray = ["foo",,,,,,,,,,undefined,{},10,,,,,"bar"];

-

An array-like is an object that has at least a length property, but was not initialized with new Array or []; For example, the below objects are classified as array-like.

{0: "foo", 1: "bar", length:2}
document.body.children
new Uint8Array(3)
  • This is array-like because although it's a(n) (typed) array, coercing it to an array changes the constructor.
(function(){return arguments})()

Observe what happens using a method that does coerce array-likes into arrays like slice.

var slice = Array.prototype.slice;
// For arrays:
console.log(slice.call(["not an array-like, rather a real array"]));
// For array-likes:
console.log(slice.call({0: "foo", 1: "bar", length:2}));
console.log(slice.call(document.body.children));
console.log(slice.call(new Uint8Array(3)));
console.log(slice.call( function(){return arguments}() ));
  • NOTE: It is bad practice to call slice on function arguments because of performance.

Observe what happens using a method that does not coerce array-likes into arrays like concat.

var empty = [];
// For arrays:
console.log(empty.concat(["not an array-like, rather a real array"]));
// For array-likes:
console.log(empty.concat({0: "foo", 1: "bar", length:2}));
console.log(empty.concat(document.body.children));
console.log(empty.concat(new Uint8Array(3)));
console.log(empty.concat( function(){return arguments}() ));
Lucio M. Tato
  • 5,639
  • 2
  • 31
  • 30
Jack G
  • 4,553
  • 2
  • 41
  • 50
21

The following seems simplest to me:

var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);

As "push" takes a variable number of arguments, you can use the apply method of the push function to push all of the elements of another array. It constructs a call to push using its first argument ("newArray" here) as "this" and the elements of the array as the remaining arguments.

The slice in the first statement gets a copy of the first array, so you don't modify it.

Update If you are using a version of javascript with slice available, you can simplify the push expression to:

newArray.push(...dataArray2)
shaunc
  • 5,317
  • 4
  • 43
  • 58
  • 1
    Is also mentioned [here at MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push) as an example for "Merging two arrays" – Wilt Apr 27 '18 at 15:48
19

With JavaScript ES6, you can use the ... operator as a spread operator which will essentially convert the array into values. Then, you can do something like this:

const myArray = [1,2,3,4,5];
const moreData = [6,7,8,9,10];

const newArray = [
  ...myArray,
  ...moreData,
];

While the syntax is concise, I do not know how this works internally and what the performance implications are on large arrays.

Ryan H.
  • 7,374
  • 4
  • 39
  • 46
  • 2
    If you take a look at [how babel converts it](http://babeljs.io/repl/#?babili=false&browsers=&build=&builtIns=false&code_lz=MYewdgzgLgBAhgJwQRhgXhgbQOTgKbYA0M2UA7iNgLoDcAUKJLIggEzpakAWCeBx2AGYgArgmr06LZADoADiIhcAFDLUtWAShpA&debug=false&circleciRepo=&evaluate=false&lineWrap=true&presets=es2015%2Creact%2Cstage-2&prettier=false&targets=&version=6.26.0), you'll see that it should not be any slower than using `Array.push.apply` technique. – emil.c Dec 11 '17 at 09:19
  • 1
    @JackGiffin I was just referring to what Ryan mentioned that he doesn't know how it works internally and what are performance implications, I wasn't actually suggesting this approach. In any case, you've done a very good job on your answer, nice research, it's always good to know such details. – emil.c Nov 22 '18 at 19:50
16
var a=new Array('a','b','c');
var b=new Array('d','e','f');
var d=new Array('x','y','z');
var c=a.concat(b,d)

Does that solve your problem ?

Sébastien VINCENT
  • 1,096
  • 6
  • 11
13

The function below doesn't have an issue with the length of arrays and performs better than all suggested solutions:

function pushArray(list, other) {
    var len = other.length;
    var start = list.length;
    list.length = start + len;
    for (var i = 0; i < len; i++ , start++) {
        list[start] = other[i];
    }
}

unfortunately, jspref refuses to accept my submissions, so here they are the results using benchmark.js

        Name            |   ops/sec   |  ± %  | runs sampled
for loop and push       |      177506 |  0.92 | 63
Push Apply              |      234280 |  0.77 | 66
spread operator         |      259725 |  0.40 | 67
set length and for loop |      284223 |  0.41 | 66

where

for loop and push is:

    for (var i = 0, l = source.length; i < l; i++) {
        target.push(source[i]);
    }

Push Apply:

target.push.apply(target, source);

spread operator:

    target.push(...source);

and finally the 'set length and for loop' is the above function

Panos Theof
  • 1,450
  • 1
  • 21
  • 27
  • This question is looking for a way to create a new array each time, not modify an existing array. – Jack G Aug 15 '18 at 09:17
13

I am providing 2 simple ways to do it :

Solution 1:

let dataArray1= [0, 1];
let dataArray1= [2, 3];
dataArray1.push(...dataArray2);
console.log(dataArray1) 

Solution 2:

let dataArray1 = [1, 2];
let dataArray2 = [3, 4];
let newArray = dataArray1.concat(dataArray2);
console.log(newArray)
Arun s
  • 869
  • 9
  • 19
11

If you want to modify the original array, you can spread and push:

var source = [1, 2, 3];
var range = [5, 6, 7];
var length = source.push(...range);

console.log(source); // [ 1, 2, 3, 5, 6, 7 ]
console.log(length); // 6

If you want to make sure only items of the same type go in the source array (not mixing numbers and strings for example), then use TypeScript.

/**
 * Adds the items of the specified range array to the end of the source array.
 * Use this function to make sure only items of the same type go in the source array.
 */
function addRange<T>(source: T[], range: T[]) {
    source.push(...range);
}
orad
  • 15,272
  • 23
  • 77
  • 113
9

Here's the ES6 way

var newArray = [];
let dataArray1 = [1,2,3,4]
let dataArray2 = [5,6,7,8]
newArray = [...dataArray1, ...dataArray2]
console.log(newArray)

The above method is good to go for most of the cases and the cases it is not please consider concat, like you have hundred thousands of items in arrays.

    let dataArray1 = [1,2,3,4]
    let dataArray2 = [5,6,7,8]
    let newArray = dataArray1.concat(dataArray2);
    console.log(newArray)
Black Mamba
  • 13,632
  • 6
  • 82
  • 105
9

Performance

I analyse current solutions and propose 2 new (F and G presented in details section).

Today 2023.3.15 I perform tests on MacOs Monterey 12.1 (M1, 16GB) on Chrome v109, Safari v15.2 and Firefox v110 for chosen solutions

Results

For all browsers

  • solution based on concat (A) is fastest on Chrome and Safari for big array and quite fast on firefox. For small array is quite fast
  • solution based on for (H) is fastest on Firefox, and medium fast on other browsers
  • solutions C,D are fastest on chrome for small arrays and
  • solution based on reduce (E) is slowest

enter image description here

Details

I perform 2 tests cases:

  • when arrays have 10 elements - you can run it HERE
  • when arrays have 10k elements - you can run it HERE

Below snippet presents differences between solutions A, B, C, D, E, F(my), G(my), H, I

// https://stackoverflow.com/a/4156145/860099
function A(a,b) {
  return a.concat(b);
}

// https://stackoverflow.com/a/38107399/860099 
function B(a,b) {
  return [...a, ...b];
}

// https://stackoverflow.com/a/32511679/860099
function C(a,b) {
  return (a.push(...b), a);
}

// https://stackoverflow.com/a/4156156/860099
function D(a,b) {
    Array.prototype.push.apply(a, b);
    return a;
}

// https://stackoverflow.com/a/60276098/860099
function E(a,b) {
    return b.reduce((pre, cur) => [...pre, cur], a);
}

// my
function F(a,b) {
    while(b.length) a.push(b.shift());
    return a;
}

// my
function G(a,b) {
    while(a.length) b.unshift(a.pop());
    return b;
}

// https://stackoverflow.com/a/44087401/860099
function H(a, b) {
    var len = b.length;
    var start = a.length;
    a.length = start + len;
    for (var i = 0; i < len; i++ , start++) {
        a[start] = b[i];
    }
    return a;
}

// https://stackoverflow.com/a/51860949/860099
function I(a, b){
   var oneLen = a.length, twoLen = b.length;
   var newArr = [], newLen = newArr.length = oneLen + twoLen;
   for (var i=0, tmp=a[0]; i !== oneLen; ++i) {
        tmp = a[i];
        if (tmp !== undefined || a.hasOwnProperty(i)) newArr[i] = tmp;
    }
    for (var two=0; i !== newLen; ++i, ++two) {
        tmp = b[two];
        if (tmp !== undefined || b.hasOwnProperty(two)) newArr[i] = tmp;
    }
    return newArr;
}






// ---------
// TEST
// ---------

let a1=[1,2,3];
let a2=[4,5,6];

[A,B,C,D,E,F,G,H,I].forEach(f=> {
    console.log(`${f.name}: ${f([...a1],[...a2])}`)
})

And here are example results for chrome

enter image description here

Kamil Kiełczewski
  • 85,173
  • 29
  • 368
  • 345
  • Wow, this is amazing answer! Thanks a lot!! I tried a variation of `F` so that array b is not eliminated and that resulted in 100% slower computation! Really strange. ```function F2(a,b) { for(elem of b) a.push(elem); return a; } F2(a,b);``` – Sarang Mar 11 '23 at 05:56
  • 1
    @Sarang The reason was that arrays `a` and `b` was not reset after each test-case execution - so when we use `shift/pop` we quickly reduce array size to zero during test-case execution (this explain "high performance" of F and G). Thank you for your comment - I update and perform new tests and rewrite answer. – Kamil Kiełczewski Mar 15 '23 at 09:22
  • Oh damn! Thanks for the update! This is community collaboration at it's best :-) – Sarang Mar 15 '23 at 11:11
8

There are a number of answers talking about Array.prototype.push.apply. Here is a clear example:

var dataArray1 = [1, 2];
var dataArray2 = [3, 4, 5];
var newArray = [ ];
Array.prototype.push.apply(newArray, dataArray1); // newArray = [1, 2]
Array.prototype.push.apply(newArray, dataArray2); // newArray = [1, 2, 3, 4, 5]
console.log(JSON.stringify(newArray)); // Outputs: [1, 2, 3, 4, 5]

If you have ES6 syntax:

var dataArray1 = [1, 2];
var dataArray2 = [3, 4, 5];
var newArray = [ ];
newArray.push(...dataArray1); // newArray = [1, 2]
newArray.push(...dataArray2); // newArray = [1, 2, 3, 4, 5]
console.log(JSON.stringify(newArray)); // Outputs: [1, 2, 3, 4, 5]
Stephen Quan
  • 21,481
  • 4
  • 88
  • 75
2

We have two array a and b. the code what did here is array a value is pushed into array b.

let a = [2, 4, 6, 8, 9, 15]

function transform(a) {
    let b = ['4', '16', '64']
    a.forEach(function(e) {
        b.push(e.toString());
    });
    return b;
}

transform(a)

[ '4', '16', '64', '2', '4', '6', '8', '9', '15' ]
KARTHIKEYAN.A
  • 18,210
  • 6
  • 124
  • 133
0

Try this:

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayB.reduce((pre, cur) => [...pre, ...cur], arrayA);
console.log(newArray)
MartenCatcher
  • 2,713
  • 8
  • 26
  • 39
Trilok Singh
  • 1,227
  • 12
  • 10
0

Alternatively, you can also write the concat method, in this way:

const arrayA = [1, 2],
      arrayB = [3, 4];
const newArray = [].concat(arrayA, arrayB);
console.log(newArray);
XMehdi01
  • 5,538
  • 2
  • 10
  • 34
-3

instead of push() function use concat function for IE. example,

var a=a.concat(a,new Array('amin'));
user1911703
  • 740
  • 5
  • 8
  • 24
-3

Тhis is a working code and it works fine:

var els = document.getElementsByTagName('input'), i;
var invnum = new Array();
var k = els.length;
for(i = 0; i < k; i++){invnum.push(new Array(els[i].id,els[i].value))}
-5
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    //Scanner sc=new Scanner(System.in);
    
    int[] ij= {1,4,222,455,111};
    int[] ijk=Arrays.copyOf(ij,ij.length);
    for(int i=0;i<ij.length;i++) {
        System.out.print(i);
    }
    System.out.println(" ");
    for(int i=0;i<ijk.length;i++) {
        System.out.print(i);
    }
    
    
}

Output: 01234 01234

Pawan
  • 14
  • 2