# [javascript] How do you easily create empty matrices javascript?

In python, you can do this:

``````[([None] * 9) for x in range(9)]
``````

and you'll get this:

``````[[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None],
[None, None, None, None, None, None, None, None, None]]
``````

How can I do the equivalent in javascript?

This question is related to `javascript`

With ES6 spread operator: `Array(9).fill([...Array(9)])`

For a 2-d matrix I'd do the following

``````var data = Array(9 * 9).fill(0);
var index = (i,j) => 9*i + j;
//any reference to an index, eg. (3,4) can be done as follows
data[index(3,4)];
``````

You can replace 9 with any generic ROWS and COLUMNS constants.

Here's one, no looping:

``````(Math.pow(10, 20)+'').replace((/0/g),'1').split('').map(parseFloat);
``````

Fill the '20' for length, use the (optional) regexp for handy transforms and map to ensure datatype. I added a function to the Array prototype to easily pull the parameters of 'map' into your functions.. bit risky, some people strongly oppose touching native prototypes, but it does come in handy..

``````    Array.prototype.\$args = function(idx) {
idx || (idx = 0);
return function() {
return arguments.length > idx ? arguments[idx] : null;
};
};

// Keys
(Math.pow(10, 20)+'').replace((/0/g),'1').split('').map(this.\$args(1));
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

// Matrix
(Math.pow(10, 9)+'').replace((/0/g),'1').split('').map(this.\$args(1)).map(this.\$args(2))
``````

If you really like one-liners and there is a use for underscore.js in your project (which is a great library) you can do write-only things like:

``````_.range(9).map(function(n) {
return _.range(9).map(function(n) {
return null;
});
});
``````

But I would go with standard for-cycle version mentioned above.

Use this function or some like that. :)

``````function createMatrix(line, col, defaultValue = 0){
return new Array(line).fill(defaultValue).map((x)=>{ return new Array(col).fill(defaultValue); return x; });
}
var myMatrix = createMatrix(9,9);
``````

This is an exact fix to your problem, but I would advise against initializing the matrix with a default value that represents '0' or 'undefined', as Arrays in javascript are just regular objects, so you wind up wasting effort. If you want to default the cells to some meaningful value, then this snippet will work well, but if you want an uninitialized matrix, don't use this version:

``````/**
* Generates a matrix (ie: 2-D Array) with:
* 'm' columns,
* 'n' rows,
* every cell defaulting to 'd';
*/
function Matrix(m, n, d){
var mat = Array.apply(null, new Array(m)).map(
Array.prototype.valueOf,
Array.apply(null, new Array(n)).map(
function() {
return d;
}
)
);
return mat;
}
``````

Usage:

``````< Matrix(3,2,'dobon');
> Array [ Array['dobon', 'dobon'], Array['dobon', 'dobon'], Array['dobon', 'dobon'] ]
``````

If you would rather just create an uninitialized 2-D Array, then this will be more efficient than unnecessarily initializing every entry:

``````/**
* Generates a matrix (ie: 2-D Array) with:
* 'm' columns,
* 'n' rows,
* every cell remains 'undefined';
*/
function Matrix(m, n){
var mat = Array.apply(null, new Array(m)).map(
Array.prototype.valueOf,
new Array(n)
);
return mat;
}
``````

Usage:

``````< Matrix(3,2);
> Array [ Array[2], Array[2], Array[2] ]
``````

better. that exactly will work.

``````let mx = Matrix(9, 9);

function Matrix(w, h){
let mx = Array(w);
for(let i of mx.keys())
mx[i] = Array(h);
return mx;
}
``````

what was shown

``````Array(9).fill(Array(9)); // Not correctly working
``````

It does not work, because all cells are fill with one array

The question is slightly ambiguous, since `None` can translate into either `undefined` or `null`. `null` is a better choice:

``````var a = [], b;
var i, j;
for (i = 0; i < 9; i++) {
for (j = 0, b = []; j < 9; j++) {
b.push(null);
}
a.push(b);
}
``````

If `undefined`, you can be sloppy and just don't bother, everything is `undefined` anyway. :)

``````Array.from(new Array(row), () => new Array(col).fill(0));
``````

JavaScript doesnâ€™t have a built-in 2D array concept, but you can certainly create an array of arrays.

``````function createMatrix(row, column, isEmpty) {
let matrix = []
let array = []
let rowColumn = row * column
for (let i = 1; i <= rowColumn; i++) {
isEmpty ?  array.push([]) :  array.push(i)

if (i % column === 0) {
matrix.push(array)
array = []
}
}
return matrix
}

createMatrix(5, 3, true)
``````

or

``````function createMatrix(row, column, from) {

let [matrix, array] = [[], []],
total = row * column

for (let element = from || 1; element <= total; element++) {
array.push(element)
if (element % column === 0) {
matrix.push(array)
array = []
}
}

return matrix
}

createMatrix(5, 6, 1)
``````

_x000D_
_x000D_
``````// initializing depending on i,j:_x000D_
var M=Array.from({length:9}, (_,i) => Array.from({length:9}, (_,j) => i+'x'+j))_x000D_
_x000D_
// Print it:_x000D_
_x000D_
console.table(M)_x000D_
// M.forEach(r => console.log(r))_x000D_
document.body.innerHTML = `<pre>\${M.map(r => r.join('\t')).join('\n')}</pre>`_x000D_
// JSON.stringify(M, null, 2) // bad for matrices``````
_x000D_
_x000D_
_x000D_

Beware that doing this below, is wrong:

``````// var M=Array(9).fill([]) // since arrays are sparse
// or Array(9).fill(Array(9).fill(0))// initialization

// M[4][4] = 1
// M[3][4] is now 1 too!
``````

Because it creates the same reference of Array 9 times, so modifying an item modifies also items at the same index of other rows (since it's the same reference), so you need an additional call to .slice or .map on the rows to copy them (cf torazaburo's answer which fell in this trap)

note: It may look like this in the future, with slice-notation-literal proposal (stage 1)

``````const M = [...1:10].map(i => [...1:10].map(j => i+'x'+j))
``````

I'll give it my shot as well

``````var c = Array;

for( var i = 0, a = c(9); i < 9; a[i] = c(9), i++ );

console.log( a.join(",") );
//",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"
``````

There is something about `Array.fill` I need to mention.

If you just use below method to create a 3x3 matrix.

``````Array(3).fill(Array(3).fill(0));
``````

You will find that the values in the matrix is a reference.

#### Optimized solution (prevent passing by reference):

If you want to pass by value rather than reference, you can leverage `Array.map` to create it.

``````Array(3).fill(null).map(() => Array(3).fill(0));
``````

#### `Array.fill`

Consider using `fill`:

``````Array(9).fill().map(()=>Array(9).fill())
``````

The idea here is that `fill()` will fill out the items with `undefined`, which is enough to get `map` to work on them.

You could also fill directly:

``````Array(9).fill(Array(9))
``````

Alternatives to `Array(9).fill()` include

``````Array(...Array(9))
[].push(...Array(9))
[].concat(Array(9))
Array.from(Array(9))
``````

We can rewrite the solution a bit more semantically as:

``````function array9() { return Array(9).fill(); }
array9().map(array9)
``````

or

``````function array(n) { return Array(n).fill(); }
array(9).map(() => array(9))
``````

`Array.from` provides us with an optional second mapping argument, so we have the alternative of writing

``````Array.from(Array(9), () => Array.from(Array(9));
``````

or, if you prefer

``````function array9(map) { return Array.from(Array(9), map); }
array9(array9);
``````

For verbose description and examples, see Mozilla's Docs on `Array.prototype.fill()` here.
and for `Array.from()`, here.

Note that neither `Array.prototype.fill()` nor `Array.from()` has support in Internet Explorer. A polyfill for IE is available at the above MDN links.

#### Partitioning

``````partition(Array(81), 9)
``````

if you have a `partition` utility handy. Here's a quick recursive one:

``````function partition(a, n) {
return a.length ? [a.splice(0, n)].concat(partition(a, n)) : [];
}
``````

#### Looping

We can loop a bit more efficiently with

``````var a = [], b;
while (a.push(b = []) < 9) while (b.push(null) < 9);
``````

Taking advantage of the fact that `push` returns the new array length.

Coffeescript to the rescue!

`[1..9].map -> [1..9].map -> null`

Well, you can create an empty 1-D array using the explicit Array constructor:

`a = new Array(9)`

To create an array of arrays, I think that you'll have to write a nested loop as Marc described.

You can add functionality to an Array by extending its `prototype` object.

``````Array.prototype.nullify = function( n ) {
n = n >>> 0;
for( var i = 0; i < n; ++i ) {
this[ i ] = null;
}
return this;
};
``````

Then:

``````var arr = [].nullify(9);
``````

or:

``````var arr = [].nullify(9).map(function() { return [].nullify(9); });
``````