Как я могу создать двумерный массив в JavaScript? - PullRequest
1030 голосов
/ 08 июня 2009

Я читал в Интернете, и некоторые места говорят, что это невозможно, некоторые говорят, что это возможно, а затем приводят пример, а другие опровергают пример и т.д.

  1. Как объявить двумерный массив в JavaScript? (при условии, что это возможно)

  2. Как я могу получить доступ к его членам? (myArray[0][1] или myArray[0,1]?)

Ответы [ 42 ]

1 голос
/ 22 января 2018

Существует другое решение, которое не заставляет вас заранее определять размер 2-мерного массива, и оно очень лаконично.

var table = {}
table[[1,2]] = 3 // Notice the double [[ and ]]
console.log(table[[1,2]]) // -> 3

Это работает, потому что [1,2] преобразуется в строку, которая используется как строковый ключ для объекта table.

1 голос
/ 24 сентября 2015

Вы также можете создать функцию для создания 2D-массива следующим образом:

var myTable = [];

function createArray(myLength) {
    myTable = new Array(myLength);
    var cols, rows;
    for (cols = 0; cols < myLength; cols++) {
        myTable[cols] = new Array(myLength);
    }
}

Вы можете вызвать его с помощью следующего, который даст вам массив 2D 10x10.

createArray(10);

Вы также можете создать 3D-массив, используя этот метод.

1 голос
/ 19 апреля 2015

Рекурсивная функция для создания многомерного массива:

var makeArray = function (dims, arr) {          
    if (dims[1] === undefined) {
        return new Array(dims[0]);
    }

    arr = new Array(dims[0]);

    for (var i=0; i<dims[0]; i++) {
        arr[i] = new Array(dims[1]);
        arr[i] = makeArray(dims.slice(1), arr[i]);
    }

    return arr;
}

Создайте 2x3x4x2 4D-массив:

var array = makeArray([2, 3, 4, 2]);    
0 голосов
/ 08 июня 2019
Array.from({length: rows}).map(e => new Array(columns));
0 голосов
/ 21 ноября 2013

Если вам нужен 2D-массив для Google-диаграмм, лучший способ сделать это -

var finalData = [];
[["key",value], ["2013-8-5", 13.5], ["2013-7-29",19.7]...]

со ссылкой на Недопустимый двухмерный массив Google-диаграммы

0 голосов
/ 23 декабря 2017

Если вам нужна матрица 4x4, посмотрите на DOMMatrix , ее легко использовать, я могу сказать,

let m = new DOMMatrix(); 
// m.m11, m.m12, m.m13, m.m14, ..., m.m41, m.m42, m.m43, m.m44

Изначально созданный по разным причинам, он не доступен в node.js и ограничен только 4x4.

Также вы можете рассмотреть возможность использования объекта авививизации вместо массивов для JS, взгляните на мой ответ здесь , но приведенный здесь также для большей убедительности:

var tree = () => new Proxy({}, { get: (target, name) => name in target ? target[name] : target[name] = tree() });

var t = tree();
t[0][2][3] = 4;
console.log(t[0][2][3]);

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

Также посмотрите на это , если вам нужен гибкий генератор многомерных массивов.

0 голосов
/ 06 августа 2017

Это моя реализация многомерного массива.

В этом подходе я создаю массив одного измерения

Я добавил прототип функции multi к Array объекту, который можно использовать для создания массива любого измерения.

Я также добавил прототип функции index к Array объекту, который можно использовать для получения индекса в линейном массиве из многомерных индексов.

Создание массива

//Equivalent to arr[I][J][K]..[] in C
var arr = new Array().multi(I,J,K,..);

Доступ к значению массива по любому индексу

//Equivalent in C arr[i][j][k];
var vaue = arr[arr.index(i,j,k)];

SNIPPET

/*
   Storing array as single dimension 
   and access using Array.index(i,j,k,...)
*/


Array.prototype.multi = function(){
 this.multi_size = arguments;
 this.multi_len = 1
 for(key in arguments) this.multi_len *=  arguments[key];
 for(var i=0;i<this.multi_len;i++) this.push(0);
 return this;
}

Array.prototype.index = function(){
   var _size = this.multi_len;
   var temp = 1;
   var index = 0;
   for(key in arguments) {
      temp*=this.multi_size[key];
      index+=(arguments[key]*(_size/temp))
   }
   return index;
}

// Now you can use the multi dimension array
// A 3x3 2D Matrix

var arr2d = new Array().multi(3,3); // A 2D Array
arr2d[arr2d.index(1,1,1)]  = 5;
console.log(arr2d[arr2d.index(1,1,1)]);

// A 3x3x3 3D Matrix

var arr3d = new Array().multi(3,3,3); // a 3D Array
arr3d[arr3d.index(1,1,1)]  = 5;
console.log(arr3d[arr3d.index(1,1,1)]);

// A 4x3x3 4D Matrix
var arr4d = new Array().multi(4,3,3,3); // a 4D Array
arr4d[arr4d.index(4,0,0,1)]  = 5;
console.log(arr4d[arr4d.index(4,0,0,1)]);
0 голосов
/ 04 апреля 2014
var _field = (function()
{
    var array = [];
    for(var y = 0; y != 3; y++) { array[y] = new Array(5); }
    return array;
})();

// var item = _field[2][4];
0 голосов
/ 19 мая 2017

Это упомянуто в нескольких комментариях, но использование Array.fill () поможет построить 2-й массив:

function create2dArr(x,y) {
    var arr = [];
    for(var i = 0; i < y; i++) {
        arr.push(Array(x).fill(0));
    }
    return arr; 
}

это приведет к массиву длиной x, y раз в возвращенном массиве.

0 голосов
/ 09 апреля 2014

Что произойдет, если размер массива неизвестен? Или массив должен быть динамически создан и заполнен? Альтернативное решение, которое сработало для меня, состоит в том, чтобы использовать класс со статической переменной 2d-массива, который в случае отсутствия индекса в массиве инициирует его:

function _a(x,y,val){
    // return depending on parameters
    switch(arguments.length){
        case 0: return _a.a;
        case 1: return _a.a[x];
        case 2: return _a.a[x][y];
    }

    // declare array if wasn't declared yet
    if(typeof _a.a[x] == 'undefined')
        _a.a[x] = [];

    _a.a[x][y] = val;
}
// declare static empty variable
_a.a = [];

Синтаксис будет:

_a(1,1,2); // populates [1][1] with value 2
_a(1,1);   // 2 or alternative syntax _a.a[1][1]
_a(1);     // [undefined × 1, 2]
_a.a;      // [undefined × 1, Array[2]]
_a.a.length
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...