Javascript 4D массивы
У кого-нибудь есть функция для создания 4D-массивов (или любого количества измерений, если это важно)?
Я хотел бы вызвать функцию, после чего я могу сделать что-то вроде arr[3][2][23][12] = "awesome";
Ответы
Ответ 1
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 могут быть любыми.
Алгоритм также оптимизирован, дайте ему еще один шаг.
Ответ 2
Быстрая и грязная:
var arr = [[[[[]]]]];
Проверьте http://jsfiddle.net/MJg9Y/
Примечание. Вам все равно нужно инициализировать каждое измерение. Вышеописанное создает основу для 4-мерного массива в arr[0]
.
Ответ 3
Здесь простое рекурсивное решение. Реальный мозг - это функция 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);
Ответ 4
Просто установите каждое значение в существующем массиве равным новому массиву, но сколько бы элементов вам ни понадобилось.
См. этот учебник для некоторых хороших примеров. Вы можете сделать это с любым количеством измерений.
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] = '';
}
}
Ответ 5
Обновление
Исправлены некоторые проблемы с предыдущей функцией; это похоже на трюк:
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
Ответ 6
Fwiw, я разместил объект с трехмерным массивом здесь. В этом примере
objTeams.aaastrTeamsByLeagueCityYear["NFL"]["Detroit"][2012] == "Lions".
Ответ 7
Очень простая функция, сгенерируйте массив с любым количеством измерений. Укажите длину каждого измерения и контент, который для меня обычно равен
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;
};
Я использую эту функцию очень часто, это экономит много времени
Ответ 8
Используйте следующую функцию для создания и инициализации массива любого измерения
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)
}
Например, для создания массива из двух строк и трех столбцов используйте его, как показано ниже.
var a=ArrayND("Hello",2,3)
Это создаст требуемый массив и инициализирует все значения с помощью "Hello"
Аналогично созданию 4-мерного массива используйте его как
var a=ArrayND("Hello",2,3,4,5)