Я читал в Интернете, и в некоторых местах говорится, что это невозможно, в других - что возможно, и приводится пример, а третьи опровергают этот пример и т.д.
Как объявить двумерный массив в JavaScript? (если предположить, что это возможно).
Как получить доступ к его членам? (myArray[0][1]
или myArray[0,1]
?)
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);
Вы просто делаете каждый элемент в массиве массивом.
var x = new Array(10);
for (var i = 0; i < x.length; i++) {
x[i] = new Array(3);
}
console.log(x);
Похожие к Activa'ы ответ, здесь's в функцию, чтобы создать 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)]
В JavaScript есть только 1-мерных массивов, но вы можете создавать массивы массивов, как отметили другие.
Следующая функция может использоваться для создания 2-Д массив фиксированных измерений:
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;
// ...
Array.from(Array(2), () => new Array(4))
2 и 4 первого и второго измерений соответственно.
Мы используем Array.from
, который может принимать массив как параметр и дополнительный отображение для каждого из элементов.
массив.из(arrayLike[, функции mapfn[, параметр thisarg]])
в
var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);
в
Тот же трюк может быть использован для создания JavaScript-массив, содержащий от 1...N
N = 10,000
)Array(2).fill(null).map(() => Array(4))
Снижение производительности происходит с тем, что мы должны провести первое измерение значения инициализации для запуска .карта
. Помните, что массив
не будет выделять позиции, пока вы не закажете его до конца.заливка или прямое присвоение значения.
в
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 пустых элементов> ], [ <4 пустых элементов> ] ]
), существует одна загвоздка: первое измерение массива были скопированы по ссылке. Что означает Арр[0][0] = 'фу'
будет на самом деле изменить две строки вместо одной.
в
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);
в
Почему некоторые говорят, что это'т это возможно, потому что двумерный массив-это просто массив массивов. Другие комментарии здесь дают вполне допустимые методы создания двумерных массивов в JavaScript, но самые чистые точки зрения будет то, что у вас есть одномерный массив объектов, каждый из этих объектов будет одномерный массив, состоящий из двух элементов.
Так, что'ы причины противоречивых точек зрения.
Несколько человек показывают использование: Чтобы привнести что-то новое, я покажу вам, как инициализировать матрицу с некоторого значения, например: 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
Самый здравомыслящий ответ
в
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);
в
Обратите внимание, мы можем'т напрямую заполнить строки с заполнить использует мелкий конструктор копирования, поэтому все строки будут делиться same памяти...вот пример, который демонстрирует, как каждая строка будет ОБЩИЙ (из других ответов):
// 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);
Это то, чего я добился :
в
var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);
в
Это меня приворожила bineeshkumar
Самый простой способ:
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'
Чтобы создать 2D массив в JavaScript, мы можем создать первый массив, а затем добавить массивов, как это's элементов. Этот метод будет возвращать в 2D массив с заданным количеством строк и столбцов.
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Д" в массив (Х,Y) со всеми индексами адресно и значений имеет значение null:
let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null)))
бонус на "3Д" в массив (х,у,Z)
let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))
Изменения и исправления на этот счет упоминал в комментариях и в различных точках в ответ на этот вопрос, но не в качестве фактического ответа, поэтому я добавляю его здесь.
Следует отметить, что (как и большинство других ответов) Это О(х*г) сложность времени, поэтому он, вероятно, не подходит для очень больших массивов.
В 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 х м
вы хотите, и заполнить его со значением по умолчанию позвонив по телефону
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],
]
*/
Больше примеров и документации можно найти здесь.
Обратите внимание, что это не стандартная функция еще.
Мой подход очень похож на @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
Для любителей одного лайнера массив.из()
// creates 8x8 array filed with "0"
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"));
Еще один (из комментария к dmitry_romanov) использовать массив().заполнить()
// creates 8x8 array filed with "0"
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"));
JavaScript не поддерживает двумерные массивы, вместо этого мы сохраняем массив в другой массив и извлекать данные из этого массива в зависимости от того массива, который вы хотите открыть. Помните массиве нумерация начинается на ноль.
Пример Кода:
/* 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