Я читал в Интернете, и некоторые места говорят, что это невозможно, некоторые говорят, что это возможно, а затем приводят пример, а другие опровергают пример и т. Д.
Как мне объявить двумерный массив в JavaScript? (при условии, что это возможно)
Как бы я получить доступ к его членам? (
myArray[0][1]
илиmyArray[0,1]
?)
var arr2D = new Array(5).fill(new Array(3));
каждый элемент Array (5), он будет указывать на один и тот же Array (3). Поэтому лучше использовать цикл for для динамического заполнения подмассивов.a = Array(5).fill(0).map(x => Array(10).fill(0))
fill
не вызываетnew Array(3)
для каждого индекса заполняемого массива, так как это не лямбда-выражение или что-то подобное, например, приведенный выше комментарий Longfei Wu, который изначально заполняет массив нулями, затем использует функцию map с лямбда-выражением для заполните каждый элемент новым массивом. Функция fill просто заполняет массив именно тем, что вы ему говорите. Имеет ли это смысл? Для получения дополнительной информации оmap
функции см .: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…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.
Ответы:
источник
Вы просто делаете каждый элемент в массиве массивом.
источник
new Array(size)
гдеsize
есть переменная.Подобно ответу activa, вот функция для создания n-мерного массива:
источник
var array = createArray(2, 3, 4, 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]]]]]
Javascript имеет только одномерные массивы, но вы можете создавать массивы из массивов, как отмечали другие.
Следующая функция может использоваться для построения двумерного массива с фиксированными размерами:
Количество столбцов не очень важно, потому что не требуется указывать размер массива перед его использованием.
Тогда вы можете просто позвонить:
источник
Самый простой способ:
источник
myArray[1]=[];
перед назначениемmyArray[1][0]=5;
myArray.length == 1
иmyArray[0].length == 0
. Что тогда дает неправильный результат, если вы затем скопируете в него «действительно пустой» массив «0x0».Как создать пустой двумерный массив (в одну строку)
2 и 4 - первое и второе измерения соответственно.
Мы используем
Array.from
, который может принимать подобный массиву параметр и необязательное отображение для каждого из элементов.Тот же трюк можно использовать для создания массива JavaScript, содержащего 1 ... N
Альтернативно (но более неэффективно на 12% с
n = 10,000
)Снижение производительности связано с тем, что для запуска нам необходимо инициализировать первые значения измерений
.map
. Помните, чтоArray
не будет распределять позиции до тех пор, пока вы не закажете это сквозным.fill
или прямым присвоением значения.Следовать за
Вот метод, который кажется правильным, но имеет проблемы .
Несмотря на то, что он возвращает желаемый двумерный массив array (
[ [ <4 empty items> ], [ <4 empty items> ] ]
), он обнаружил, что массивы первых измерений скопированы по ссылке. Это означает,arr[0][0] = 'foo'
что фактически изменит две строки вместо одной.источник
Array.from({length:5}, () => [])
Причина, по которой некоторые говорят, что это невозможно, заключается в том, что двумерный массив на самом деле является просто массивом массивов. Другие комментарии здесь предоставляют совершенно допустимые методы создания двумерных массивов в JavaScript, но самая чистая точка зрения будет состоять в том, что у вас есть одномерный массив объектов, каждый из этих объектов будет одномерным массивом, состоящим из двух элементов.
Это и есть причина противоречивых точек зрения.
источник
string[3,5] = "foo";
. Это лучший подход для некоторых сценариев, поскольку ось Y на самом деле не является дочерней по отношению к оси X.Мало кто демонстрирует использование push:
чтобы привнести что-то новое, я покажу вам, как инициализировать матрицу некоторым значением, например: 0 или пустой строкой "".
Напомним, что если у вас есть массив из 10 элементов, в javascript последний индекс будет 9!
примеры использования:
источник
for
(который устанавливает значение по умолчанию) из вашей процедуры и записываюm=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));
- и мы получаем очень странную матрицу (слишком много вложенных) - вы исправляете ее в последнем шаге for-defaultValue, но я думаю, что вы можете переписать процедуру, чтобы использовать меньше вложенных массивов до того, как установка значений по умолчанию.Два лайнера:
Он сгенерирует массив a длиной 10, заполненный массивами. (Push добавляет элемент в массив и возвращает новую длину)
источник
for (var a=[]; a.push([])<10;);
?var
работает. Это всегда функционально ограничено.Самый разумный ответ, кажется,
Обратите внимание, что мы не можем напрямую заполнять строки, так как заполнение использует конструктор поверхностного копирования, поэтому все строки будут совместно использовать одну и ту же память ... вот пример, который демонстрирует, как каждая строка будет разделена (взято из других ответов):
источник
Array.apply(null, Array(nrows))
это, но это гораздо элегантнее.fill
. Это не будет работать в большинстве браузеров.Array(nrows).map(() => 0)
или,Array(nrows).map(function(){ return 0; });
Самый простой способ:
источник
Вот чего я достиг:
Это пишется мне бинеешкумар
источник
appVar[1][4] = "bineesh";
неправильно, как это решить?Двумерные массивы создаются так же, как и одномерные массивы. И вы получаете к ним доступ, как
array[0][1]
.источник
Я не уверен, что кто-то ответил на это, но я нашел, что это сработало для меня очень хорошо -
например:
Например, для двумерного массива.
источник
var array = [[],[]]
, достаточно.Чтобы создать 2D-массив в javaScript, мы можем сначала создать массив, а затем добавить массивы в качестве его элементов. Этот метод возвращает двумерный массив с заданным количеством строк и столбцов.
чтобы создать массив, используйте этот метод, как показано ниже.
источник
Чтобы создать не разреженный массив «2D» (x, y) со всеми адресуемыми индексами и значениями, равными нулю:
Бонус "3D" Array (x, y, z)
Вариации и исправления были упомянуты в комментариях и в разных точках в ответ на этот вопрос, но не как фактический ответ, поэтому я добавляю его здесь.
Следует отметить, что (подобно большинству других ответов) это имеет временную сложность O (x * y), поэтому, вероятно, не подходит для очень больших массивов.
источник
fill
установите то же значение. если поменятьnull
на `объект, это будет один и тот же объект в каждом столбцеlet 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
Использовать массивы
В JavaScript 1.7 и выше вы можете использовать массивы для создания двумерных массивов. Вы также можете фильтровать и / или манипулировать записями при заполнении массива и не использовать циклы.
Вы можете создать любой
n x m
массив и заполнить его значением по умолчанию, вызвавБольше примеров и документации можно найти здесь .
Обратите внимание, что это еще не стандартная функция .
источник
for
заявление все еще в цикле ...Для любителей одного лайнера Array.from ()
Другой (из комментария dmitry_romanov) использует Array (). Fill ()
Использование оператора распространения ES6 + («вдохновлен» ответом InspiredJW :))
источник
0
в первойfill()
функции:const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
Мой подход очень похож на ответ @Bineesh, но с более общим подходом.
Вы можете объявить двойной массив следующим образом:
И хранение и доступ к содержимому следующим образом:
Это напечатает ожидаемый результат
источник
Представление
Сегодня 2020.02.05 я выполняю тесты на MacO 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) для большого массива медленно во всех браузерахВыводы для инициализированного 2d массива
for/while
(A, B, C, D, E, G) являются самыми быстрыми / довольно быстрыми для небольших массивов во всех браузерахfor
(A, B, C, E) являются самыми быстрыми / довольно быстрыми для больших массивов во всех браузерахArray..map/from/fill
(I, J, K, L, M), являются средне-быстрыми или медленными для небольших массивов во всех браузерах{}/arr[[i,j]]
(N) является самым медленным для маленьких и больших массивов во всех браузерахподробности
Проверка решений, которые не заполняют (инициализируют) выходной массив
Мы тестируем скорость решений для
Показать фрагмент кода
Проверка решений, которые заполняют (инициализируют) выходной массив
Мы тестируем скорость решений для
Показать фрагмент кода
источник
Я нашел ниже самый простой способ:
источник
array1[1][100] = 666;
броскиUncaught TypeError: Cannot set property '100' of undefined
array1[1][100] = 666;
, вам нужно сделать этоarray1[1] = [];
.Javascript не поддерживает двухмерные массивы, вместо этого мы сохраняем массив внутри другого массива и извлекаем данные из этого массива в зависимости от того, к какой позиции этого массива вы хотите получить доступ. Помните, что нумерация массивов начинается с нуля .
Пример кода:
источник
источник
ES6 +, ES2015 + могут сделать это еще проще
Создание массива 3 x 2, заполненного true
источник
Мне пришлось создать гибкую функцию массива, чтобы добавлять в нее «записи» по мере необходимости и иметь возможность обновлять их и выполнять любые необходимые вычисления, прежде чем я отправлю их в базу данных для дальнейшей обработки. Вот код, надеюсь, это поможет :).
Не стесняйтесь оптимизировать и / или указать на любые ошибки :)
источник
aLine.push([clmn1, clmn2, clmn3]);
?Вот быстрый способ, который я нашел, чтобы сделать двумерный массив.
Вы также можете легко превратить эту функцию в функцию ES5.
Почему это работает:
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 и заполняет их
null
источник
md[1][0] = 3
и все остальные элементы тоже обновляютсяРазмеры строк и столбцов массива известны только во время выполнения, тогда для создания динамического 2d-массива можно использовать следующий метод .
источник
Есть еще одно решение, которое не заставляет вас заранее определять размер 2d-массива, и это очень лаконично.
Это работает потому,
[1,2]
что преобразуется в строку, которая используется в качестве строкового ключа дляtable
объекта.источник
var table = new Proxy({}, {get:(t,n)=>n in t ? t[n] : 42});
Чтобы создать массив 4x6, просто сделайте это
источник