Javascript 4D массивы - PullRequest
       13

Javascript 4D массивы

2 голосов
/ 19 мая 2011

У кого-нибудь есть функция для создания 4D-массивов (или любого числа измерений в этом отношении)?

Я хотел бы вызвать функцию, затем после этого я могу сделать что-то вроде arr[3][2][23][12] = "awesome";

Ответы [ 8 ]

5 голосов
/ 19 мая 2011

Быстро и грязно:

var arr = [[[[[]]]]];

Проверить http://jsfiddle.net/MJg9Y/

Примечание: Вам все равно нужно будет инициализировать каждое измерение. Вышеуказанное создает основу для четырехмерного массива в arr[0].

5 голосов
/ 19 мая 2011
function make(dim, lvl, arr) {
  if (lvl === 1) return [];
  if (!lvl) lvl = dim;
  if (!arr) arr = [];
  for (var i = 0, l = dim; i < l; i += 1) {
    arr[i] = make(dim, lvl - 1, arr[i]);
  }
  return arr;
}

var myMultiArray = make(4);

Обновление: вы можете указать, насколько глубоким должен быть уровень в первом параметре и сколько уровней во втором.Например:

var myMultiArray = make(64, 4);

Это позволит вам установить и получить в следующем формате:

myMultiArray[X][X][X][X] = ....

Но X всегда должно быть меньше 64. Вы не можете установить myMultiArray[X][70][X][X], например,потому что myMultiArray[X][70] еще не был определен

Примечание - работа make(64, 4) ужасно медленная - вы создаете 64 ^ 4 пустых элемента массива (т.е. 16 777 216).

Обновление 2: вы можете получить последнее значение в виде любого числа или строки.То есть.myMultiArray[X][X][X][Y] где X <64 и Y может быть чем угодно. </p>

Алгоритм также оптимизирован, попробуйте еще раз.

3 голосов
/ 19 мая 2011

Вот простое рекурсивное решение. Настоящий мозг - это функция mdim. Он просто вызывает себя, если глубина не равна 1, и когда он туда попадает, просто возвращает пустой массив.

Поскольку кажется, что вы, возможно, захотите использовать это для многих вещей, я обернул его в прототип из массива, чтобы вы могли автоматически использовать его в своих массивах (компромисс между удобством и удобством обслуживания). Если вы предпочитаете, возьмите функцию mdim из замыкания, и она должна нормально работать.

В конце есть простой тестовый пример, чтобы вы могли увидеть, как его использовать. Удачи! :)

//adds a multidimensional array of specified depth to a given array
//I prototyped it off of array for convenience, but you could take 
//just the mdim function
Array.prototype.pushDeepArr = function( depth ){
    var arr = (mdim = function( depth ){
        if( depth-- > 1 ){
            return [ mdim( depth ) ];
        } else {
            return [];
        }
    })(depth);
    this.push(arr);
};

//example: create an array, add two multidimensional arrays
//one of depth 1 and one of depth 5
x = [];
x.pushDeepArr(1);
x.pushDeepArr(5);
2 голосов
/ 19 мая 2011

Просто установите каждое значение в существующем массиве равным новому массиву, с тем количеством элементов, которое вам нужно.

См. в этом руководстве для некоторых хороших примеров.Вы можете сделать это с любым количеством измерений.

var myArray = new Array(3);

for (var i = 0; i < 3; i++) {
    myArray[i] = new Array(3);
    for (var j = 0; j < 3; j++) {
        myArray[i][j] = '';
    }
}
1 голос
/ 27 октября 2015

Используйте следующую функцию для создания и инициализации массива любого измерения

function ArrayND(initVal) 
{
    var args = arguments;
    var dims=arguments.length-1
    function ArrayCreate(cArr,dim)
    {
        if(dim<dims)
        {
            for(var i=0;i<args[1 + dim];i++)
            {
                if(dim==dims-1) cArr[i]=initVal
                else    cArr[i]=ArrayCreate([],dim+1)
            }
            return cArr
        }
    }
    return ArrayCreate([],0)
}

Например, для создания массива из 2 строк и 3 столбцов используйте его, как показано ниже:

var a=ArrayND("Hello",2,3)

Это создаст массив require и инициализирует все значения с помощью «Hello»

Аналогично, для создания 4-мерного массива используйте его как

var a=ArrayND("Hello",2,3,4,5)
1 голос
/ 28 января 2015

Очень простая функция, сгенерируйте массив с любым количеством измерений.Укажите длину каждого измерения и содержание, которое для меня обычно «1001 *

function arrayGen(content,dims,dim1Len,dim2Len,dim3Len...) {
  var args = arguments;
  function loop(array,dim) {
    for (var a = 0; a < args[dim + 1]; a++) {
      if (dims > dim) {
        array[a] = loop([],dim + 1);
      } else if (dims == dim) {
        array[a] = content;
      }
    }
    return array;
  }
  var thisArray = [];
  thisArray = loop(thisArray,1);
  return thisArray;
};

. Я использую эту функцию очень часто, это экономит много времени

1 голос
/ 10 ноября 2012

Кстати, я разместил объект с трехмерным массивом здесь . В этом примере

objTeams.aaastrTeamsByLeagueCityYear["NFL"]["Detroit"][2012] == "Lions".
1 голос
/ 19 мая 2011

Обновление Исправлены некоторые проблемы с предыдущей функцией; это, кажется, делает трюк:

function multidimensionalArray(){
    var args = Array.prototype.slice.call(arguments);

    function helper(arr){
        if(arr.length <=0){
            return;
        }
        else if(arr.length == 1){
            return new Array(arr[0]);
        }

        var currArray = new Array(arr[0]);
        var newArgs = arr.slice(1, arr.length);
        for(var i = 0; i < currArray.length; i++){
            currArray[i] = helper(newArgs);
        }
        return currArray;
    }

    return helper(args);
}

Использование

var a = multidimensionalArray(2,3,4,5);

console.log(a); //prints the multidimensional array
console.log(a.length); //prints 2
console.log(a[0].length); //prints 3
console.log(a[0][0].length); //prints 4
console.log(a[0][0][0].length); //prints 5
...