Як я можу створити двовимірний масив у JavaScript?


1136

Я читав в Інтернеті, а деякі місця кажуть, що це неможливо, деякі кажуть, що це є, а потім наводять приклад, а інші спростовують приклад тощо.

  1. Як я можу оголосити двовимірний масив у JavaScript? (припускаючи, що це можливо)

  2. Як я отримав би доступ до своїх членів? ( myArray[0][1]або myArray[0,1]?)


21
Припускаючи дещо педантичне визначення, створити 2d масив у JavaScript технічно неможливо. Але ви можете створити масив масивів, що рівнозначно тому ж.
IJ Kennedy

10
FYI ... коли ви заповнюєте масив більше масивів, використовуючи var arr2D = new Array(5).fill(new Array(3));кожен елемент масиву (5) буде вказувати на той самий масив (3). Тому найкраще використовувати цикл for для динамічного заповнення підмасивів.
Джош Стриблінг

51
a = Array(5).fill(0).map(x => Array(10).fill(0))
Лонгфей Ву

2
Іншими словами, fillне new Array(3)вимагає заповнення кожного індексу масиву, оскільки це не лямбда-вираз чи щось подібне, наприклад, коментар Longfei Wu, який спочатку заповнює масив 0, потім використовує функцію map з лямбда для заповнити кожен елемент новим масивом. Функція заливки просто заповнює масив саме тим, про що ви йому говорите. Чи має це сенс? Докладніше про mapфункцію див. На веб-сайті: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Josh Stribling

2
@kalehmann це добре: meta.stackoverflow.com/a/252017/2311074 If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
Адам,

Відповіді:


1231

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items[0][1]); // 2
console.log(items[1][0]); // 3
console.log(items[1][1]); // 4
console.log(items);


32
Було б важко ініціалізувати великий багатовимірний масив таким чином. Однак ця функція може бути використана для створення порожнього багатовимірного розміру з розмірами, вказаними як параметри.
Андерсон Грін

2
@AndersonGreen Добре, що ви згадали про посилання для тих, хто цікавиться рішенням із багато-D-масивом, але питання та відповідь Ballsacian1 стосуються масиву "2D", а не "multi-D" масиву
evilReiko

Ви повинні пройти все це ... наприклад, попередження (пункти [0] [1]); // 2 тощо
Dois

1
@SashikaXP, це не працює для перших індексів, окрім 0.
Майкл Францл

1
Питання в тому, як оголосити двовимірний масив. Це те, що я шукав і знайшов це, і наступні відповіді, які не вдається розрізнити різницю між декларуванням та ініціалізацією. Існує також декларація з відомою довжиною або без обмежень, жодна з яких не обговорюється.
chris

444

Ви просто робите кожен елемент у масиві масиву.

var x = new Array(10);

for (var i = 0; i < x.length; i++) {
  x[i] = new Array(3);
}

console.log(x);


6
Чи можуть вони використовувати для клавіш та значень такі речі, як рядки? myArray ['Книга'] ['item1']?
Дієго

42
@Diego, так, але це не те, для чого призначені масиви. Краще використовувати об’єкт, коли ваші клавіші - це рядки.
Меттью Крамлі

10
Цей приклад мені подобається краще, ніж прийнятий відповідь, оскільки це може бути реалізовано для масивів динамічного розміру, наприклад, new Array(size)де sizeє змінною.
Варіадизм

1
не працює - помилка при призначенні. Як ця відповідь отримала 280 лайків, якщо вона марна?
Гарго

1
Це працює, дякую. Ви можете побачити приклад Gargo jsfiddle.net/matasoy/oetw73sj
matasoy

198

Подібно до відповіді активації, ось функція створення n-мірного масиву:

function createArray(length) {
    var arr = new Array(length || 0),
        i = length;

    if (arguments.length > 1) {
        var args = Array.prototype.slice.call(arguments, 1);
        while(i--) arr[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

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

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]

2
Чи може це створити 4-мірний масив?
trusktr

4
@trusktr: Так, ви можете створити стільки параметрів, скільки хочете (в межах обмежень пам'яті). Просто перейдіть в довжину чотирьох вимірів. Наприклад, var array = createArray(2, 3, 4, 5);.
Меттью Крамлі

4
Найкраща відповідь! Однак я б не рекомендував використовувати його з 0 або 1 параметрами (марно)
Аполо

2
@BritishDeveloper Так. Це 5D масив з кожною довжиною по 5:[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
хайкам

2
@haykam вибачте, що витрачаєте час - я був саркастичним: /
BritishDeveloper

84

У Javascript є лише одновимірні масиви, але ви можете створювати масиви масивів, як вказували інші.

Наступна функція може бути використана для побудови двовимірного масиву фіксованих розмірів:

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

Кількість стовпців насправді не важлива, оскільки не потрібно вказувати розмір масиву перед його використанням.

Тоді ви можете просто зателефонувати:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...

Я хочу зробити 2-тьмяний масив, який би представляв колоду карт. Який би був 2-тьмяний масив, який містить значення картки, а потім - костюм. Що було б найпростіше зробити це.
Doug Hauf

1
функція Create2DArray (рядки) {var arr = []; for (var i = 0; i <рядки; i ++) {arr [i] = []; } повернення arr; } функція print (дека) {for (t = 1; t <= 4; t ++) {for (i = 1; i <= 13; i ++) {document.writeln (deck [t] [i]); }}} fucntion fillDeck (d) {for (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; для (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; }}} функція loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); друк (myCardDeck); }
Doug Hauf

2
@Doug: Ви дійсно хочете одновимірний масив об'єктів з двома атрибутами. var deck = []; колода [0] = {обличчя: 1, масть: 'H'};
TeasingDart

@DougHauf - це помірний 2D-масив ?? : P: D
Махі

78

Найпростіший спосіб:

var myArray = [[]];

29
що є двовимірним масивом
Maurizio У датці

15
Так, обережно з цим. Призначення myArray [0] [що завгодно] добре, але спробуйте встановити myArray [1] [що завгодно], і він скаржиться, що myArray [1] не визначений.
Філіп

22
@Philip ви повинні встановити myArray[1]=[];перед призначеннямmyArray[1][0]=5;
182764125216

4
Пам'ятайте, що це не "створює порожній масив 1x1", як писав @AndersonGreen. Він створює масив "1x0" (тобто 1 рядок, що містить масив з 0 стовпцями). myArray.length == 1і myArray[0].length == 0. Що потім дає неправильний результат, якщо потім скопіювати в нього "справді порожній" масив "0x0".
JonBrave

3
@ 182764125216 це було знання дня для мене. Дякую :)
th3pirat3

76

Як створити порожній двовимірний масив (однорядковий)

Array.from(Array(2), () => new Array(4))

2 і 4 - перший і другий розміри відповідно.

Ми використовуємо Array.from, який може приймати парам-ями, що нагадують масив, та необов'язкове відображення для кожного з елементів.

Array.from (arrayLike [, mapFn [, thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

Цей же трюк можна використовувати для створення масиву JavaScript, що містить 1 ... N


Альтернативно (але більш неефективно 12% з n = 10,000)

Array(2).fill(null).map(() => Array(4))

Зниження продуктивності пов'язане з тим, що для запуску ми повинні ініціалізувати перші значення розмірів .map. Пам’ятайте, що Arrayвони не виділятимуть позиції, поки ви не накажете це наскрізне .fillабо пряме присвоєння значення.

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);


Слідувати

Ось метод, який видається правильним, але має проблеми .

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

Хоча він повертає, мабуть, бажаний двовимірний масив ( [ [ <4 empty items> ], [ <4 empty items> ] ]), є улов: перші масиви масиву були скопійовані за посиланням. Це означає, що а arr[0][0] = 'foo'фактично змінить два ряди замість одного.

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);


Я пропоную це:Array.from({length:5}, () => [])
vsync

Суб’єктивний тут, але ця відповідь (перша та друга всередині нього) здається найкращим балансом лаконічних, швидких та сучасних.
Брейді Даулінг

@zurfyx будь-яка ідея, чи хтось знає, чому веб-шторм скаржиться на це? Здається, array.from продовжує залишати значення як невизначені, і тоді я не можу працювати зі створеним масивом, хоча фрагмент працює нормально тут у
stackoverflow

46

Причина, по якій деякі кажуть, що це неможливо, це тому, що двовимірний масив насправді є лише масивом масивів. Інші коментарі тут надають ідеально правильні методи створення двовимірних масивів у JavaScript, але найчистішою точкою зору буде те, що у вас є одновимірний масив об'єктів, кожен з цих об'єктів був би одновимірним масивом, що складається з двох елементів.

Отже, це причина суперечливих точок зору.


41
Ні це не так. У деяких мовах ви можете мати багатовимірні масиви на зразок string[3,5] = "foo";. Це є кращим підходом для деяких сценаріїв, оскільки вісь Y насправді не є дочірньою віссю X.
Рафаель Соарес

3
Після потрапляння до основного машинного коду всі тензори розміру> 1 - це масиви масивів, якою б мовою ми не говорили. Варто пам’ятати про це з міркувань оптимізації кешу. Будь-яка гідна мова, яка серйозно задовольняє числові обчислення, дозволить вам вирівняти багатовимірну структуру в пам'яті таким чином, щоб ваш найбільш використовуваний вимір зберігався безперервно. На думку приходять Python's Numpy, Fortran та C. Дійсно, є випадки, коли з цієї причини варто зменшити розмірність на кілька структур.
Томас Браун

Комп'ютери не мають поняття розмірів. Є лише 1 вимір, адреса пам'яті. Все інше - це примітна прикраса на користь програміста.
TeasingDart

3
@ThomasBrowne Не зовсім. "Масиви масивів" вимагають деякого зберігання для розмірів внутрішніх масивів (вони можуть відрізнятися) та іншого перенаправлення покажчика, щоб знайти місце, де зберігається внутрішній масив. У будь-якій "гідній" мові багатовимірні масиви відрізняються від нерівних масивів, оскільки вони самі по собі різні структури даних. (І заплутаною частиною є те, що масиви C є багатовимірними, навіть якщо вони індексуються з синтаксисом [a] [b].)
polkovnikov.ph

33

Мало хто показує використання push:
Щоб принести щось нове, я покажу вам, як ініціалізувати матрицю з деяким значенням, наприклад: 0 або порожнім рядком "".
Нагадуючи, що якщо у вас масив 10 елементів, у javascript останній індекс буде 9!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

приклади використання:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

Я видаляю forз вашої процедури останнє (яке встановлює значення за замовчуванням) і m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));записую - і ми отримуємо дуже strage-матрицю (занадто багато вкладених) - ви ремонтуєте її в останній крок за замовчуваннямValue, але я думаю, ви можете переписати процедуру для використання менш вкладених масивів раніше встановлення значень за замовчуванням.
Kamil Kiełczewski

27

Дволінійний:

var a = []; 
while(a.push([]) < 10);

Він створить масив a довжиною 10, заповнений масивами. (Push додає елемент до масиву і повертає нову довжину)


13
Один лайнер: for (var a=[]; a.push([])<10;);?
Бергі

@Bergi, чи змінна все ще буде визначена в наступному рядку ..?
StinkyCat

1
@StinkyCat: Так, так varпрацює. Це завжди функціонує.
Бергі

Я знаю, тому ваш
однолінійний

1
domenukk і @Bergi, ви обоє правильні. Я спробував це, і я можу отримати доступ після після. Прошу пробачення! і дякую, нехай це для мене буде урок;)
StinkyCat

24

Здається, найчесніша відповідь

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);


Зауважте, що ми не можемо безпосередньо заповнювати рядки, оскільки для використання використовується неглибокий конструктор копій, тому всі рядки матимуть однакову пам’ять ... ось приклад, який демонструє, як би поділявся кожен рядок (взято з інших відповідей):

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);

Це має бути в самому верху. Я робив щось подібне, використовуючи, Array.apply(null, Array(nrows))але це набагато елегантніше.
димігель

Що стосується мого останнього коментаря ... Internet Explorer і Opera не підтримують fill. Це не працює для більшості браузерів.
диміґуель

@dimgl Заповнення в цьому випадку можна наслідувати постійною картою: Array(nrows).map(() => 0)або,Array(nrows).map(function(){ return 0; });
Conor O'Brien

20

Найпростіший спосіб:

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

18

Ось чого я досяг:

var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);

Це прописало мене бінеешкумаром


2
Зверніть увагу, як ви можете отримати доступ лише до індексу 0 батьківського масиву. Це не так корисно, як щось, що дозволяє встановити, наприклад, appVar [5] [9] = 10; ... ви отримаєте "Неможливо встановити властивість" 9 "невизначеного" за допомогою цього.
RaisinBranCrunch

Але appVar[1][4] = "bineesh";помиляється, як це вирішити?
Ганк

16

Двомірні масиви створюються так само, як і одновимірні масиви. І ви отримуєте доступ до них як array[0][1].

var arr = [1, 2, [3, 4], 5];

alert (arr[2][1]); //alerts "4"

14

Я не впевнений, чи хтось відповів на це, але я вважав, що це спрацювало для мене досить добре -

var array = [[,],[,]]

наприклад:

var a = [[1,2],[3,4]]

Наприклад, для двовимірного масиву, наприклад.


Як я можу це зробити динамічно? Я хочу внутрішні масиви з різними розмірами.
алап

3
Вам не потрібні зайві коми var array = [[],[]].
Тост Кая

13

Щоб створити 2D масив в javaScript, ми можемо спершу створити масив, а потім додати масиви як його елементи. Цей метод поверне двовимірний масив із заданою кількістю рядків та стовпців.

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

для створення масиву використовуйте цей метод, як показано нижче.

var array = Create2DArray(10,20);

2
Будь ласка, додайте пояснювальну інформацію до свого відповіді, де відображається, як вона працює, і чому вона вирішує проблему. Це допоможе іншим, хто знайде цю сторінку в майбутньому
Наша людина в бананах,

Коли вам знадобиться масив, який попередньо ініціалізується з певною кількістю колон у Javascript? Ви також можете отримати доступ до n-го елемента масиву [].
domenukk

Я помітив, що функція починається з великої літери C, яка (за певними умовами) передбачає, що це буде конструктор функцій, і ви використовуєте її з новим ключовим словом. Можливо, дуже другорядне і дещо висловлене, але я все-таки запропонував би слово з великої літери.
Хачі

12

Щоб створити нерозріджений "2D" масив (x, y) з усіма індексами, адресованими та значеннями, встановленими на нуль:

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

бонусний "3D" масив (x, y, z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

Варіанти та виправлення з цього приводу були згадані в коментарях та в різних точках у відповідь на це питання, але не як фактична відповідь, тому я додаю його тут.

Слід зазначити, що (подібно до більшості інших відповідей) це має часову складність O (x * y), тому, ймовірно, не підходить для дуже великих масивів.


1
будьте обережні, бо fillвстановіть однакове значення. якщо змінити nullна `об'єкт, він буде однаковим у кожному стовпчику
Станіслав Майоров,

@StanislavMayorov Якщо ви хочете встановити значення кожної комірки, просто використовуйте один і той же трюк:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

10

Використовуйте розуміння масиву

У JavaScript 1.7 та новіших версіях ви можете використовувати розуміння масиву для створення двовимірних масивів. Ви також можете фільтрувати та / або маніпулювати записами під час заповнення масиву і не потрібно використовувати петлі.

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/

Ви можете створити будь-який n x mпотрібний масив і заповнити його за замовчуванням, зателефонувавши

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/

Більше прикладів та документації можна знайти тут .

Зверніть увагу, що це ще не стандартна функція .


Швидка перевірка тут google ... так ... forзаява все ще є циклом ...
Сутенер Тризкіт

1
Його не підтримує жоден браузер - ТУТ ?
Kamil Kiełczewski

10

Для одного любителя лайнера Array.from ()

// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))

Ще один (з коментаря dmitry_romanov) використання Array (). Fill ()

// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))

Використання ES6 + спред оператора ( «надихнув» на InspiredJW відповідь :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))

2
ми можемо зняти 0в першій fill()функції:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Jinsong Li

8

Мій підхід дуже схожий на відповідь @Bineesh, але з більш загальним підходом.

Ви можете оголосити подвійний масив наступним чином:

var myDoubleArray = [[]];

І зберігання та доступ до вмісту таким чином:

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 

Це надрукує очікуваний вихід

[ 9, 8 ] 9 123

7

Нижче я знайшов найпростіший спосіб:

var array1 = [[]];   
array1[0][100] = 5; 

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);

array1[1][100] = 666;кидкиUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski

@ KamilKiełczewski ви праві, виглядає так, що це лише ініціатор для першого масиву масиву, для другого, перш ніж це зробити array1[1][100] = 666;, вам потрібно зробити це array1[1] = [];.
GMsoF

7

Продуктивність

Сьогодні 2020.02.05 я виконую тести на MacOs HighSierra 10.13.6 на Chrome v79.0, Safari v13.0.4 та Firefox v72.0, для обраних рішень.

Висновки для неініціалізованого 2d масиву

  • езотеричне рішення {}/arr[[i,j]](N) найшвидше для великих та малих масивів, і схоже, що це хороший вибір для великих рідкісних масивів
  • рішення на основі for-[]/while(A, G) швидкі, і вони хороший вибір для малих масивів.
  • рішення for-[](B, C) швидкі і вони хороший вибір для великих масивів
  • рішення на основі Array..map/from/fill(I, J, K, L, M) є досить повільними для малих масивів і досить швидкими для великих масивів
  • надмірно for-Array(n)(B, C) на сафарі набагато повільніше, ніж for-[](A)
  • надмірно for-[](A) для великого масиву повільно у всіх браузерах
  • рішення K повільно для малих масивів для всіх браузерів
  • рішення A, E, G повільні для великих масивів для всіх браузерів
  • рішення M є найповільнішим для всіх масивів у всіх браузерах

введіть тут опис зображення

Висновки для ініціалізованого 2d масиву

  • рішення на основі for/while(A, B, C, D, E, G) - найшвидші / досить швидкі для невеликих масивів у всіх браузерах
  • рішення на основі for(A, B, C, E) є найшвидшими / досить швидкими для великих масивів у всіх браузерах
  • рішення на основі Array..map/from/fill(I, J, K, L, M) є середньо швидкими або повільними для невеликих масивів у всіх браузерах
  • рішення F, G, H, I, J, K, L для великих масивів є середніми або швидкими для хрому та сафарі, але найповільнішими для Firefox.
  • езотеричне рішення {}/arr[[i,j]](N) є найповільнішим для малих та великих масивів у всіх браузерах

введіть тут опис зображення

Деталі

Перевірте рішення, які не заповнюють (ініціалізують) вихідний масив

Ми перевіряємо швидкість рішень для

  • малі масиви (12 елементів) - ви можете виконувати тести на своїй машині ТУТ
  • великі масиви (1 мільйон елементів) масиви - ви можете проводити тести на своїй машині ТУТ

Тест на рішення, які заповнюють (ініціалізують) вихідний масив

Ми перевіряємо швидкість рішень для

  • малі масиви (12 елементів) - ви можете виконувати тести на своїй машині ТУТ
  • великі масиви (1 мільйон елементів) масиви - ви можете проводити тести на своїй машині ТУТ

введіть тут опис зображення


6

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

6

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;
  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);


6

ES6 +, ES2015 + можуть зробити це ще простішим способом


Створення масиву 3 x 2, наповненого true

[...Array(3)].map(item => Array(2).fill(true))

Мені потрібно зізнатися. Я "прийняв" вашу відповідь і додав до моєї колекції одноліній.
мій-

5

Мені довелося зробити гнучку функцію масиву, щоб додати до неї "записи", як мені потрібно, і мати можливість оновлювати їх і робити всі необхідні обчислення, перш ніж я відправив його в базу даних для подальшої обробки. Ось код, сподіваюся, що він допоможе :).

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"
}

Не соромтеся оптимізувати та / або вказувати на будь-які помилки :)


А як щодо aLine.push([clmn1, clmn2, clmn3]);?
Сутенер Трізкіт

5

Ось швидкий спосіб, який я знайшов, щоб скласти двовимірний масив.

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

Внизу однієї створюється матриця розміром 5х5 і заповнює їх null

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

console.log(md);


3
Ця відповідь неправильна. Він створить масив із однаковим заповненням масиву в своїх слотах. md[1][0] = 3 а також усі інші елементи оновлюються
Qiang

5

Розміри рядків і стовпців масиву, відомі лише під час виконання, тоді для створення динамічного 2d масиву можна використовувати наступний метод .

var num = '123456';
var row = 3; // Known at run time
var col = 2; // Known at run time
var i = 0;

var array2D = [[]];
for(var r = 0; r < row; ++r)
{
    array2D[r] = [];
    for(var c = 0; c < col; ++c)
    {
        array2D[r][c] = num[i++];
    }
}
console.log(array2D); 
// [[ '1', '2' ], 
//  [ '3', '4' ], 
//  [ '5', '6' ]]

console.log(array2D[2][1]); // 6

4

Є ще одне рішення, яке не змушує вас заздалегідь визначити розмір 2d масиву, і це дуже стисло.

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

Це працює тому, що [1,2]перетворюється в рядок, який використовується як рядовий ключ для tableоб'єкта.


Сама відповідь змушує мене не хотіти возитися з мотлохом, який є "багатовимірними" масивами в JavaScript, навіть тому, що у мене дуже елегантне рішення. Це також ілюструє, що всі інші насправді взагалі не створюють багатовимірні масиви. Просто подобається "масив" у JavaScript; ця відповідь повністю "імітує" нескінченний розмір масиву псевдо нескінченних розмірів довільних розмірів та вмісту. Усі інші відповіді, засновані на рекурсії та циклі, мають набагато нижню верхню межу розміру структури масиву, який вони можуть створити. швидкість буде головним питанням для цих великих структур.
Сутенер Трізкіт

Використовуйте цей рядок замість того, щоб імітувати попереднє заповнення:var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Сутенер Тризкіт

Хороший, креативний спосіб "наслідувати" Array2D об'єктом :)
Kamil Kiełczewski

4

Щоб створити масив 4x6, просто зробіть це

const x = [...Array(6)].map(elem => new Array(4))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.