2

Here is my code:

var arr = [[[[[]]]]];
var c = 20;
for (i=0;i<5;i++)
    arr[i][0][0][0] = c;
alert(arr[2][0][0][0]);

It doesn't work, but how can I do this?

1
  • "This is not work" is not a sufficient explanation. You should at least describe what you expect the result to look like, preferably with more than one. Commented Dec 19, 2015 at 21:26

4 Answers 4

2

Most people here are using for loops, which I think are mostly obsolete in the age of anonymous functions in JavaScript. You people should know better :P

Anyway, you can solve this quite nicely in a one-liner. Here are a few scripts that can initialize your array...

If you already have a 4-dimensional array, you can initialize it elegantly like this:

arr.forEach(function(e) { e[0][0][0] = c })

Or, if you're more into map:

arr.map(function(e) { e[0][0][0] = c })

These are assuming you already have c defined, which you do in your code sample (20).

From now on, though, please Google your questions before asking them on stackoverflow. You will receive an answer that has already been accepted :)

Sign up to request clarification or add additional context in comments.

2 Comments

Except that your example doesn't do what the OP wants. arr only contains one member, so forEach will only loop over that one member and set one value. The OP seems to be trying to fill 5 members with the value 20.
Ah, sorry. I guess I misunderstood the question.
1

It doesn't work because you haven't specified any elements beyond the first one, so the length of array is one and accessing further keys is incorrect.

I think, the most convenient way would be to push a new 3d array with c inside on every iteration (actually I have no idea what you're trying to achieve with this xD):

var arr = [];
var c = 20;
for (i=0;i<5;i++) 
    arr.push([[[c]]])

alert(arr[2][0][0][0]);

(in your example it's actually 5d, but as you've asked for 4d, writing 4d there)

1 Comment

tnx, but this is only work for first dimension, when I try to this: arr[0][i][0][0] = c; or arr[0][0][0][i] = c; this is not work, I don't want to write arr for every dimension, How about this?
1

It is unclear what you want, but I imagine a 4 dimension array is an array that has a set of arrays nested 3 deep, each of which has an array nested 2 deep, each of which has a single array that contains values.

In a one dimension array, you access the value at index 2 by:

arr[2];

In a two dimension array, you'd access the value at (2,3) by:

arr[2][3]

and so on until you get to the value at (2,3,1,2) in a four dimension array by:

arr[2][3][1][2]

and if that was the only value in the array, it would look like:

[,,[,,,[,[,,'value at 2312']]]];

If there was also a value at (1,1,0,2) the array would now look like:

[,[,[[,,'value at 1102']]],[,,,[,[,,'value at 2312']]]];

There can only be values in the last nested array, the value at indexes in every other array must be another array (for the lower dimensions), so to insert at value at, say (2,1,3,1) and assign it a value of 6, you need to loop over the array and inspect each index. If it's not already an array, insert an array and keep going, e.g.:

// Insert value in arrary at coord
// coord is a comma separated list of coordinates.
function insertValue( array, coord, value) {
  var coords = coord.split(',');
  var arr = array;

  for (var c, i=0, iLen=coords.length-1; i < iLen; i++) {
    c = coords[i];
    
    if (!Array.isArray(arr[c])) arr[c] = [];
    arr = arr[c];
  }
  arr[coords[i]] = value;
  return array;
}

document.write('result: ' + JSON.stringify(insertValue([],'1,2,1,3','at 1213')));

I don't understand what you are trying to do in the OP: are you trying to create a value of 20 at coordinates (0,0,0,0), (1,0,0,0), (2,0,0,0), etc.? If that is the case, you also need a fill function that will iterate for the required number of times and pass suitable arguments to insertValue.

If that's what you want, then given the above you should be able to write such a function. On the first iteration it would pass:

insertValue(array, '0,0,0,0', 20)

and on the second:

insertValue(array, '1,0,0,0', 20)

and so on. You may wish to modify the function so that instead of the coords being a CSV string, you pass an array like [0,0,0,0] (which is what split turns the CSV string into), but that's up to you.

Note that you must pass all 4 dimensions, otherwise you will replace one of the dimension arrays with a value and effectively delete all other points in that dimension sector.

PS

ES5 introduced forEach, which helps encapsulate loops but doesn't necessarily mean less code, or faster execution, than an equivalent for loop:

// Insert value in arr at coord
// coord is a comma separated list of coordinates.
function insertValue( array, coord, value) {
  var arr = array;
  var coords = coord.split(',');
  var last = coords.pop();

  coords.forEach(function(c) {
    if (!Array.isArray(arr[c])) arr[c] = [];
    arr = arr[c];
  })
  arr[last] = value;
  return array;
}

Comments

1

Create array with 5 nested arrays:

var arr = [[[[[]]]], [[[[]]]], [[[[]]]], [[[[]]]], [[[[]]]], [[[[]]]]];
var c = 20;
for (i=0;i<5;i++) 
    arr[i][0][0][0] = c;

alert(arr[2][0][0][0]);

EDIT: if you dig into functional programming and recursion, you can initialize your multidimensional array with just a few lines of code. Let's say you want 4-dimensional array with length 10 of each dimension:

function createNDimensionalArray(n, length) {
    return n === 1 
        ? new Array(length)
        : Array.apply(null, Array(length)).map(createNDimensionalArray.bind(null, n - 1, length));
}

var arr = createNDimensionalArray(4, 10);
console.log(arr); // creates 4-dimensional array 10x10x10x10

Notice that initialization like this could be very slow if you create very big arrays (e.g. createNDimensionalArray(5, 10000).

If you prefer to set length of each dimension, you can modify previous the solution like this:

function createNDimensionalArray(dims) {
    return dims.length === 1
        ? new Array(dims[0])
        : Array.apply(null, Array(dims[0])).map(createNDimensionalArray.bind(null, dims.slice(1)));
}

var arr = createNDimensionalArray([2, 3, 4, 5]);
console.log(arr); // creates 4-dimensional array 2x3x4x5

2 Comments

tnx, but this is only work for first dimension, when I try to this: arr[0][i][0][0] = c; or arr[0][0][0][i] = c; this is not work, I don't want to write arr for every dimension, How about this?
I am afraid you have to create array for every dimension.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.