Как сделать из двумерного массива одномерный js

Обновлено: 04.07.2024

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

Всё достаточно просто, если исходный массив у нас двумерный. Возьмём, для примера, такой:

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

Можно конечно и поизвращаться, но больше для расширения кругозора, чем для реальной практики в данной задаче. Будем использовать две функций: array_map() - применяет callback-функцию к каждому элементу массива и функцию array_merge(), которую рассматривали выше.

Немного расшифрую: в качестве callback-функции, мы используем анонимную функцию, которая получает поочерёдно каждый из вложенных массивов в переменную "$a" и сливает с массивом "$arrOut", который в итоге и будет содержать все значения исходного массива, но уже как одномерным. Так как внутри callback-функции массив "$arrOut" будет не виден (если только он не объявлен глобальным), мы используем ключевое слово use, которое позволяет использовать внешние переменные. Но передаём массив не как значение, а как "ссылку", поставив перед переменной символ амперсанда "&". Если бы мы этого не сделали, то каждый раз, мы получали бы пустой массив "$arrOut", который сливали с текущим "$a".
Для новичков всё это пока малопонятно и, пытаясь адаптировать код под свои нужды, могут наделать ошибок. Не пугайтесь - есть решение "в пару строк";) Используем функцию call_user_func_array(), которая, по сути, сделает всё то, что мы делали во втором примере, но, так сказать, одним махом.

В результате всех вышеупомянутых вариантов, мы получим массив такого вида:

Хочу отметить, что в случае, если вложенные массивы являются ассоциативными, то при совпадении ключей, последующий элемент будет перезаписывать предыдущий с таким же ключом. Чтобы избежать такой неувязочки и получить все значения, мы немного доработаем наш код функцией array_values():

Остаётся выяснить, какой из трёх вариантов работает быстрее. Я сгенерировал массив, состоящий из сотни вложенных массивов, в каждом из которых по десять элементов и вот средние результаты, которые говорят сами за себя:

Способ секунд
Цикл + array_merge 0.0109
array_map + array_merge 0.0170
call_user_func_array 0.0009

С двумерными массивами немного разобрались, теперь перейдём к более сложной задаче - трехмерные (и более) массивы или многоуровневые массивы с неизвестной вложенностью. И первое решение, которое напрашивается - это использование рекурсии.

Вполне нормальный способ, который, на мой взгляд, не требует каких-то подробных разъяснений и хорошо справляется со своей задачей. Многие, даже не задумываясь, именно его бы и применили. Но я хочу показать, как это же можно сделать буквально парой строк кода, используя "итераторы" из стандартной библиотеки PHP (SPL):

Вот и всё! И результат будет, как и в первом случае такой:

Ну, и как в первом случае, показываю среднюю скорость выполнения двух вариантов:

Способ секунд
Рекурсия 0.2558
Классы итераторов 0.0346

Разница в скорости - более, чем в семь раз и кода меньше примерно во столько же! Дальнейшие комментарии излишни. ;)

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

На предыдущий твой вопрос тебе в двух ответах предложили два разных варианта решения - чем они тебя не устроили?

Массив A[n][m] можно представить в виде одномерного массива B[n * m] простым преобразованием индексов.

Элемент A[i][j] соответствует элементу В [i * m + j]
Элемент B[k] соответствует элементу A[k / m][k % m]

P.S. Это элементарные вещи, которые должны рассматриваться в любом приличном учебнике программирования.

Я не автор вопроса, но может Вы посоветуете учебник по программированию? А то вот такого типа формулы приходится выводить самостоятельно, и хотя делаю я это с удовольствием, уходит куча времени. Спасибо!

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

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

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

ОТВЕТЫ

Ответ 1

Ответ 2

Вы просто делаете каждый элемент массива массивом.

Ответ 3

Как и для ответа activa, здесь можно создать n-мерный массив:

Ответ 4

Javascript имеет только 1-мерные массивы, но вы можете создавать массивы массивов, как указывали другие.

Для построения 2-мерного массива фиксированных измерений можно использовать следующую функцию:

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

Затем вы можете просто позвонить:

Ответ 5

Самый простой способ:

Ответ 6

2 и 4 являются первым и вторым измерениями соответственно.

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

Ответ 7

Причина, по которой некоторые говорят, что это невозможно, состоит в том, что двухмерный массив - это просто массив массивов. Другие комментарии здесь представляют собой совершенно правильные методы создания двумерных массивов в JavaScript, но самая чистая точка зрения состоит в том, что у вас есть одномерный массив объектов, каждый из которых будет одномерным массивом, состоящим из двух элементов.

Итак, причина возникновения противоречивых точек зрения.

Ответ 8

Мало кто показывает использование push:
Чтобы принести что-то новое, я покажу вам, как инициализировать матрицу с некоторым значением, например: 0 или пустая строка "".
Напоминая, что если у вас есть массив из 10 элементов, в javascript последнему индексу будет 9!

Ответ 9

Он будет генерировать массив a длиной 10, заполненный массивами. (Push добавляет элемент в массив и возвращает новую длину)

Ответ 10

Кажется, что самый здравый ответ

Ответ 11

Самый простой способ:

Ответ 12

Это то, что я достиг:

Ответ 13

Двумерные массивы создаются так же, как и одномерные массивы. И вы обращаетесь к ним как array[0][1] .

Ответ 14

Я не уверен, что кто-то ответил на это, но я нашел, что это сработало для меня довольно хорошо -

Для двухмерного массива, например.

Ответ 15

Чтобы создать 2D-массив в javaScript, мы можем сначала создать массив, а затем добавить массивы в качестве его элементов. Этот метод вернет 2D-массив с заданным количеством строк и столбцов.

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

Ответ 16

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

бонус "3D" Array (x, y, z)

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

Ответ 17

Использовать методы построения массивов

В JavaScript 1.7 и выше вы можете использовать методы массива для создания двумерных массивов. Вы также можете фильтровать и/или манипулировать элементами при заполнении массива и не использовать циклы.

Вы можете создать любой массив n x m , который вы хотите, и заполнить его значением по умолчанию, вызвав

Дополнительные примеры и документацию можно найти здесь.

Обратите внимание, что это еще не стандартная функция.

Ответ 18

Мой подход очень похож на @Bineesh, но с более общим подходом.

Вы можете объявить двойной массив следующим образом:

И сохранение и доступ к содержимому следующим образом:

Это напечатает ожидаемый результат

Ответ 19

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

Другой (из комментария dmitry_romanov) использует Array(). fill()

Ответ 20

Я нашел ниже самый простой способ:

Ответ 21

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

Пример кода:

Ответ 22

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

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

Ответ 23

Вот быстрый способ, который я нашел, чтобы создать двумерный массив.

Вы можете легко включить эту функцию в функцию 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 ).

Ответ 24

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

Ответ 25

Ответ 26

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

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

Ответ 27

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

Ответ 28

Ответ 29

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

Ответ 30

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

Нужно превратить двумерный массив в одномерный. Я пытался что-то написать и даже немного приблизился к разгадке. Вот мой код:

Проблема в том, что когда я пытаюсь выполнить сложение массива через reduce мне выдаёт тот же результат, что был бы при сложении одномерного массива. Вот код:

Если кто-то знает как решить это прошу Вас помощи.

Ответы (6 шт):

На планкере проверил - работает!

Нужно так reduce использовать

Исходя из документации, можно смело применять concat к исходному массиву (если он состоит только из чисел или только строк. если там объекты и прочие сложные штучки - то будет плохо).

Метод concat() возвращает новый массив, состоящий из массива, на котором он был вызван, соединённого с другими массивами и/или значениями, переданными в качестве аргументов.

Синтаксис

где valueN - Массивы и/или значения, соединяемые в новый массив.

Там же показан пример

Однако если принять во внимание тот факт, что num2 и num3 ни что иное, как те же вложенные массивы в вашем arr , то получится, что можно сделать так:

В Javascript имеется оператор расширения (ES6) или по другому spread operator. С помощью него выражение [].concat(arr[0],arr[1],arr[2] ) можно сократить и получить:

JavaScript - Массивы в вопросах и ответах

Удаление элемента (ов) из массива осуществляется одним из следующих методов:

  • .pop() - предназначен для удаления последнего элемента массива.
  • .shift() - предназначен для удаление первого элемента массива.
  • .splice() - может использоваться для удаления одного или нескольких элементов из массива, начиная с указанного.

Как удалить массив

Для того чтобы удалить массив, хранящейся в некоторой переменной, достаточно присвоить ей другое значение.

Как добавить элемент в массив

Для добавления элемента в массив можно воспользоваться одним из следующих методов:

  • .push() - предназначен для добавления элемента в конец массива.
  • .unshift() - предназначен для добавления элемента в начало массива.
  • .splice() - может использоваться для добавления одного или нескольких элементов в массив, начиная с указанного.

Как вывести массив

Для того чтобы вывести массив в некоторый элемент на веб-странице его предварительно необходимо преобразовать в строку.

Например, вывести содержимое некоторого массива в элемент с id="array" :

Как создать пустой массив

Создание пустого массива осуществляется следующими конструкциями:

Как очистить массив

Для того чтобы удалить все элементы из некоторого массива можно воспользоваться одним из следующих способов:

Как объединить массивы

Для того чтобы объединить 2 или больше массивов можно воспользоваться методом concat() . Этот метод не изменяет существующие массивы, он создаёт новый массив, содержащий элементы объединяемых массивов.

Как узнать является ли объект массивом

Для того чтобы узнать какой тип данных содержит переменная можно воспользоваться одной из следующих конструкций:

Как узнать индекс элемента в массиве

Для того чтобы найти некоторый элемент в массиве можно воспользоваться методом indexOf() . Значение, которое надо найти у элемента указывается в качестве первого параметра ( valueElement ). Данный параметр является обязательным. Кроме этого при необходимости можно указать индекс элемента ( startIndex ) в качестве 2 параметра данного метода, чтобы поиск элемента осуществлялся не с начала, а с указанного элемента.

В качестве результата метод indexOf() возвращает индекс найденного элемента или значение -1 . В том случае если указанное значение имеют несколько элементов, то данный метод возвращает индекс первого найденного элемента.

Примечание: Если вы хотите осуществлять поиск элемента в массиве начиная с конца, то используйте метод lastIndexOf() .

Как найти максимальное значение массива

Для того чтобы найти максимальное значение массива можно воспользоваться следующей конструкцией:

Как найти минимальное значение массива

Для того чтобы найти минимальное значение массива можно воспользоваться следующей конструкцией:

Как заполнить массив с помощью метода fill

Метод fill() предназначен для заполнения массива или его части с помощью указанного значения:

Перемешать массив

Для того чтобы перемешать элементы в массиве можно воспользоваться следующей функцией:

Для того чтобы скопировать массив используйте следующий код:

Сортировка числового массива по убыванию

Для сортировки числового массива по убыванию можно использовать метод sort() :

Сортировка числового массива по возрастанию

Для сортировки числового массива по возрастанию можно использовать метод sort() :

Как проверить существование элемента в массиве

Для того чтобы проверить есть ли указанный элемент в массиве или нет можно воспользоваться методом indexOf() .

Сумма значений элементов массива

Определение суммы элементов числового массива:

Как создать двумерный и многомерный массивы в JavaScript

Готовых функций для создания и работы с двумерными и многомерными массивами в JavaScript нет. Их создание осуществляется посредством того, что каждый элемент первоначального массива в свою очередь тоже должен является массивом.

Например, создадим массив 5x5:

Например, создадим массив 3x2:

Например, создадим пустой двумерный массив:

Например, спроектируем функцию arrayTable, предназначенную для создания табличного массива:

Читайте также: