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

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

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

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

Ответы [ 42 ]

5 голосов
/ 12 октября 2012

Мне пришлось создать функцию гибкого массива, чтобы добавлять в нее «записи» по мере необходимости и иметь возможность обновлять их и выполнять любые необходимые вычисления, прежде чем отправлять их в базу данных для дальнейшей обработки. Вот код, надеюсь, это поможет:).

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}

Не стесняйтесь оптимизировать и / или указывать на любые ошибки:)

5 голосов
/ 31 июля 2015

Javascript не поддерживает двухмерные массивы, вместо этого мы сохраняем массив внутри другого массива и извлекаем данные из этого массива в зависимости от того, к какой позиции этого массива вы хотите получить доступ. Помните, что нумерация массива начинается с ZERO .

Пример кода:

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array
5 голосов
/ 25 марта 2016

Вот быстрый способ создания двумерного массива.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}

Вы также можете легко превратить эту функцию в функцию ES5.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}

Почему это работает: конструктор new Array(n) создает объект с прототипом Array.prototype и затем присваивает объекту length, в результате чего получается незаполненный массив. Из-за отсутствия реальных членов мы не можем запустить функцию Array.prototype.map.

Однако, когда вы предоставляете более одного аргумента конструктору, например, когда вы делаете Array(1, 2, 3, 4), конструктор будет использовать объект arguments для создания экземпляра и правильного заполнения объекта Array.

По этой причине мы можем использовать Array.apply(null, Array(x)), потому что функция apply будет распространять аргументы в конструкторе. Для пояснения, выполнение Array.apply(null, Array(3)) эквивалентно выполнению Array(null, null, null).

Теперь, когда мы создали реальный заполненный массив, все, что нам нужно сделать, это вызвать map и создать второй слой (y).

5 голосов
/ 23 октября 2016

Ниже, создаем матрицу 5x5 и заполняем их null

var md = [];
for(var i=0; i<5; i++) {
    md.push(new Array(5).fill(null));
}

console.log(md);
3 голосов
/ 03 января 2017

Один вкладыш для создания m * n 2-мерного массива, заполненного 0.

new Array(m).fill(new Array(n).fill(0));
3 голосов
/ 21 сентября 2015

Упрощенный пример:

var blocks = [];

blocks[0] = [];

blocks[0][0] = 7;
3 голосов
/ 14 июня 2014

Я обнаружил, что этот код работает для меня:

var map = [
    []
];

mapWidth = 50;
mapHeight = 50;
fillEmptyMap(map, mapWidth, mapHeight);

...

function fillEmptyMap(array, width, height) {
    for (var x = 0; x < width; x++) {
        array[x] = [];
        for (var y = 0; y < height; y++) {

            array[x][y] = [0];
        }
    }
}
3 голосов
/ 08 июня 2009

Вы можете выделить массив строк, где каждая строка является массивом одинаковой длины. Или вы можете выделить одномерный массив с элементами row * columns и определить методы для сопоставления координат строки / столбца с индексами элементов.

Какую бы реализацию вы ни выбрали, если вы заключите ее в объект, вы можете определить методы доступа в прототипе, чтобы сделать API простым в использовании.

3 голосов
/ 03 октября 2017

var playList = [
  ['I Did It My Way', 'Frank Sinatra'],
  ['Respect', 'Aretha Franklin'],
  ['Imagine', 'John Lennon'],
  ['Born to Run', 'Bruce Springsteen'],
  ['Louie Louie', 'The Kingsmen'],
  ['Maybellene', 'Chuck Berry']
];

function print(message) {
  document.write(message);
}

function printSongs( songs ) {
  var listHTML = '<ol>';
  for ( var i = 0; i < songs.length; i += 1) {
    listHTML += '<li>' + songs[i][0] + ' by ' + songs[i][1] + '</li>';
  }
  listHTML += '</ol>';
  print(listHTML);
}

printSongs(playList);
2 голосов
/ 20 февраля 2015

Я сделал модификацию ответа Мэтью Крамли за создание функции многомерного массива. Я добавил размеры массива для передачи в качестве переменной массива, и будет еще одна переменная - value, которая будет использоваться для установки значений элементов последних массивов в многомерном массиве.

/*
*   Function to create an n-dimensional array
*
*   @param array dimensions
*   @param any type value
*
*   @return array array
 */
function createArray(dimensions, value) {
    // Create new array
    var array = new Array(dimensions[0] || 0);
    var i = dimensions[0];

    // If dimensions array's length is bigger than 1
    // we start creating arrays in the array elements with recursions
    // to achieve multidimensional array
    if (dimensions.length > 1) {
        // Remove the first value from the array
        var args = Array.prototype.slice.call(dimensions, 1);
        // For each index in the created array create a new array with recursion
        while(i--) {
            array[dimensions[0]-1 - i] = createArray(args, value);
        }
    // If there is only one element left in the dimensions array
    // assign value to each of the new array's elements if value is set as param
    } else {
        if (typeof value !== 'undefined') {
            while(i--) {
                array[dimensions[0]-1 - i] = value;
            }
        }
    }

    return array;
}

createArray([]);              // [] or new Array()

createArray([2], 'empty');    // ['empty', 'empty']

createArray([3, 2], 0);       // [[0, 0],
                              //  [0, 0],
                              //  [0, 0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...