Представьте, что у меня есть массив JS следующим образом:
Я хочу разбить этот массив на N меньших массивов. Например:
Для Python у меня есть это:
Для JS наилучшим правильным решением, которое я мог бы придумать, является рекурсивная функция, но мне она не нравится, потому что она сложна и уродлива. Эта внутренняя функция возвращает массив, подобный этому [1, 2, 3, null, 4, 5, 6, null, 7, 8], а затем мне нужно его снова закольтать и разбить вручную. (Моя первая попытка возвращала это: [1, 2, 3, [4, 5, 6, [7, 8, 9]]], и я решил сделать это с нулевым разделителем).
Как вы это сделаете? Спасибо!
Вы можете сделать срезы «сбалансированными» (длины субарирей отличаются как можно меньше) или «ровный» (все подмассивы, но последние имеют одинаковую длину):
В этой статье вы научитесь разбивать массив Javascript на куски с указанным размером, используя разные реализации.
- 1. Использование цикла for и функции слайса
- 2. Использование цикла for, слайса и функции set в прототипе массива
- 3. Использование карты массива в прототипе массива
- 4. Использование цикла и среза
- 5. Использование slice и concat в рекурсивной функции
- О производительности
- Строки
- Массивы
- Математические константы
- Специальные значения
- Url кодирование
- Диалоговые окошки
- Типизация
- Таймеры
- Разное
- Работа с DOM
- Работа с DOM
- Элементы DOM
- Узлы nodes
- Вставка элементов
- События
- Объект события
- Выделение
- Метрики и прокрутка
- Таблицы
- Конструкции языка
- Объекты
- Контекст
- Синтаксис
- Примеры
- Пример
- Пример
- Пример
- Пример
- Пример
- Пример . Применение
- Пример . Применение
- Пример . Применение
- Пример . Применение
1. Использование цикла for и функции слайса
По сути, каждый метод будет использовать метод slice для разделения массива, в этом случае отличает этот метод цикл for.
В случае, если массив не является однородным, остальные элементы также будут в массиве, однако по очевидным причинам размер будет меньше.
2. Использование цикла for, слайса и функции set в прототипе массива
Вы можете зарегистрировать пользовательские функции в прототипе функции, в этом случае вы можете создать пользовательскую функцию с именем чанка, которая выполняет нашу цель:
Как видите, принцип тот же — использование цикла for и функции slice, но вместо того, чтобы использовать его в функции, он регистрируется в прототипе массива.
3. Использование карты массива в прототипе массива
map Функция вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве по порядку и создает новый массив из результатов. Функция вернет массив с длиной, определяемой делением длины предоставленного массива на размер фрагмента. Функция fill (в качестве параметра не указано) будет заполнять созданный массив неопределенным, и, наконец, каждое неопределенное значение в массиве будет заменено новым массивом (результат среза выделенного массива с соответствующим индексом).
4. Использование цикла и среза
В типичных и нормальных условиях цикл while немного быстрее. Тем не менее, мы должны знать, что этот прирост производительности важен для большого количества итераций. Поэтому, если ваш массив огромен, и вы хотите разбить его на куски с небольшим числом, вы должны рассмотреть использование метода, который использует while, чтобы значительно увеличить производительность.
5. Использование slice и concat в рекурсивной функции
В этом методе рекурсия довольно дорогая, если говорить о производительности и ресурсах браузера. Кроме того, concat Функция в некоторых браузерах значительно медленнее, чем join метод.
Отказ от ответственности: не используйте в производственных средах с огромным количеством данных.
О производительности
Нашим простым тестом будет разделение массива из 100 000 (100 КБ) элементов (только цифры) на куски по 3 элемента / массива. Эта задача будет выполнена 1000 (1K) раз, чтобы обеспечить высокую точность, значения даны в миллисекундах.
Тест был выполнен на машине со следующими характеристиками:
- Операционная система Windows 10 Pro 64-битная
- Chrome 53.0.2785.116 м (64 бит)
- Процессор Intel® Core i5-4590 с тактовой частотой 3,30 ГГц (4 процессора),
Строки
Массивы
Математические константы
Специальные значения
Url кодирование
Диалоговые окошки
Типизация
Таймеры
Разное
Работа с DOM
Работа с DOM
Элементы DOM
Узлы nodes
Вставка элементов
События
Объект события
Выделение
Метрики и прокрутка
Таблицы
Конструкции языка
Объекты
Контекст
Метод split осуществляет разбиение строки в массив по указанному разделителю.
Разделитель указывается первым необязательным параметром. Если он не задан — вернется вся строка. Если он задан как пустые кавычки » — то каждый символ строки попадет в отдельный элемент массива.
Вторым необязательным параметром можно указать максимальное количество элементов в получившемся массиве (см. примеры).
См. также метод join, который сливает элементы массива в строку.
Синтаксис
Примеры
Пример
В данном примере строка разбита по разделителю ‘-‘. В результате получится следующий массив arr:
Результат выполнения кода:
Пример
В данном примере строка также разбита по разделителю ‘-‘, однако вторым параметром указано максимальное количество элементов в получившемся массиве (2 элемента). Поэтому в новый массив запишется только 2 элемента:
Результат выполнения кода:
Пример
Давайте каждый символ строки запишем в отдельный элемент массива:
Результат выполнения кода:
Пример
Давайте первые 3 символа строки запишем в отдельный элемент массива:
Результат выполнения кода:
Пример
Сейчас с помощью split разбивается строка с числами. Обратите внимание на то, что в результате получится массив строк [‘1’, ‘2’, ‘3’, ‘4’, ‘5’], а не массив чисел [1, 2, 3, 4, 5]:
Результат выполнения кода:
Пример . Применение
Давайте перевернем символы строки в обратном порядке. Для этого разобьем строку в массив с помощью split по разделителю » (этот разделитель положит каждый символ строки в отдельный элемент массива), перевернем этот массив с помощью reverse и затем сольем перевернутый массив обратно с помощью join:
Результат выполнения кода:
Пример . Применение
Упростим решение предыдущей задачи — сольем все команды в цепочку:
Результат выполнения кода:
Пример . Применение
Дана строка с цифрами. Найдем сумму цифр из этой строки. Для этого разобьем строку в массив, а затем переберем этот массив и найдем его сумму. Нас ждет подвох: split возвращает строки, поэтому при суммировании преобразуем эти цифры-строки в настоящие числа с помощью Number:
Результат выполнения кода:
Пример . Применение
Дано число. Давайте запишем каждую цифру этого числа в отдельный элемент массива. Тут есть подвох — split применяется только к строкам, а у нас число. Преобразуем вначале число к строке с помощью String, а затем применим split: