简体   繁体   中英

Concat in an empty array in Javascript

I was browsing through some code and I was wondering how this could be useful

grid.push([].concat(row));

In my understanding it is the same as

grid.push([row]);

Why the 'concat' fuss?

You want to use .concat when you need to flatten the array and not have an array consisting of other arrays. Eg

var a = [1,2,3];
var b = [4];

Scenario 1

console.log(b.push(a));
// Result: [4, [1,2,3]]

Scenario 2

console.log(b.concat(a));
// Result: [4,1,2,3]

So both of your scenarios in an array of array. Since [].concat() results in an array only, pushing both [row] , [].concat(row) has the same result.

But if you want a flattened array, there is a slight change needed in your code, that you have to .concat the array row with grid and not .push the result of concat to it, as shown in scenario 2

Check my variant:

let arr = [];
let tmp = [ 1, 2, '300$' ];
arr.push(...tmp);
var canEmptyArray = [];
grid = [...(grid), ...(canEmptyArray), ...(row)];

All arrays can be empty as long as it is in the array format

With grid.push([row]); you are pushing an array containing the row itself. If row is an array (eg [0, 1, 2] ). You will push an array containing another array (ie [[0, 1, 2]] ).

With grid.push([].concat(row)); , you are pushing an array containing the elements contained in row (ie [0, 1, 2] ).

However it is unclear why it is not just written grid.push(row) which, if row is an array, could seem more or less the same as grid.push([].concat(row)); .

I can find two explanations for this:

  1. row is not an array but an "array-like" object and [].concat(row) is used to convert it (just like Array.from could do).

  2. Your coder does not want to push row but a copy of row instead that protected against any further modification of the original row .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM