user10200099
user10200099

Reputation:

Creating multidimensional arrays in ES6

What is the cleanest way of allocating a multidimentional array in javascript? Or is it even necessary? Currently I am doing it like so

let dp = new Array(8).fill(null).map(item =>(new Array(8).fill(null).map(item =>(new Array(8).fill(null))))); (for 8x8x8).

Or can i just do let dp = new Array(); dp[1][1][1] = 7? Wondering the best way to do stuff like this

Upvotes: 0

Views: 273

Answers (2)

Ori Drori
Ori Drori

Reputation: 191976

I would use Array.from() and pass an array of size, and a value (val) for the last arrays. Use array destructuring, and rest to get the current array length, and array of the next nested arrays. If the next array is not empty, use the result of calling the function again. If not, return the val.

const generateMulti = ([current, ...next], val) =>
  Array.from({ length: current }, () => next.length ?
    generateMulti(next, val) : val
  )

const result = generateMulti([3, 2, 2], null)

console.log(JSON.stringify(result))

Upvotes: 1

CertainPerformance
CertainPerformance

Reputation: 370759

One possibility is to create a makeArr function which recursively calls itself, to which you can pass a nested object indicating the length and values desired, something like this:

const makeArr = (length, item) => Array.from(
  { length },
  () => typeof item === 'object' ? makeArr(item.length, item.item) : item
);

const arrx3x3 = makeArr(3, { length: 3, item: { length: 3, item: 0 } });

// check that every array is a separate reference:
arrx3x3[0][0][0] = 1;
console.log(arrx3x3);

This will allow for relatively clean creation of arbitrary array dimensions.

If every nested array will have the same length, then you just need to indicate the length on the first parameter to makeArr:

const makeArr = (length, item) => Array.from(
  { length },
  () => typeof item === 'object' ? makeArr(length, item.item) : item
);

const arrx3x3 = makeArr(3, { item: { item: 0 } });

// check that every array is a separate reference:
arrx3x3[0][0][0] = 1;
console.log(arrx3x3);

If you want to fill the nested array items with non-array objects (eg where the 0 is now, in the nested item : 0), you'll have to change the typeof item === 'object' test to something more precise.

Upvotes: 2

Related Questions