Перейти к основному содержимому

Получение частей коллекции

Иногда вам не нужен весь массив. Нужна его часть: диапазон элементов, первые или последние несколько, куски одинакового размера или движущееся окно соседей.

У массивов есть один метод на всё это: slice(). words.slice(low, high) даёт элементы с индекса low до индекса high, не включая его. Опустите high, чтобы дойти до конца. Отрицательный индекс отсчитывается с конца.

  • arr.slice(low, high) — с индекса low до high, не включая его
  • arr.slice(0, n) — первые n элементов
  • arr.slice(n) — всё с индекса n до конца
  • arr.slice(-n) — последние n элементов

slice() всегда создаёт новый массив и копирует в него выбранные элементы. Изменение копии не меняет оригинал, а изменение оригинала не меняет копию. В некоторых других языках та же операция даёт представление, разделяющее память с оригиналом, — здесь этого не происходит никогда.

Встроенных take, drop, chunked или windowed нет. Для этих задач в уроке используются slice() с вычисленными границами, цикл for или небольшая обобщённая вспомогательная функция.

Большинство примеров на этой странице используют одни и те же данные: слова one two three four five six.


Срез

Срез — это взятие элементов на некоторых выбранных позициях.

Для набора соседних позиций используйте slice(): words.slice(1, 4) даёт элементы на индексах 1, 2 и 3. Помните, что конечный индекс исключается: чтобы получить элементы с индекса 1 по 3, вы пишете slice(1, 4).

slice() не умеет пропускать элементы. Чтобы взять каждый второй элемент или элементы на позициях, которые вы перечисляете сами, используйте цикл for или map() по массиву индексов.

Срез диапазона

words.slice(1, 4) начинает с индекса 1 и останавливается перед индексом 4. В результате 3 элемента: [ 'two', 'three', 'four' ]. Это новый массив, поэтому его изменение не затронуло бы words.

Prompt
Напишите программу на TypeScript, которая создаёт массив из слов one, two, three, four, five, six. С помощью slice() возьмите элементы с индекса 1 до индекса 4, не включая его. Выведите результат.
Вывод: программа на TypeScript и захваченный вывод
Slice a range

Срез с шагом

Чтобы взять каждый второй элемент, цикл for с i += 2 посещает индексы 0, 2 и 4 и собирает слова. words.filter((_, i) => i % 2 === 0) даёт тот же результат, но он просматривает каждый элемент вместо того, чтобы перепрыгивать через них.

Prompt
Напишите программу на TypeScript, которая создаёт массив из слов one, two, three, four, five, six. Используйте цикл for, который идёт от индекса 0 до индекса 4 с шагом 2 и добавляет каждый элемент в новый массив. Выведите результат.
Вывод: программа на TypeScript и захваченный вывод
Slice with a step

Срез по списку индексов

Позиции 3, 5 и 0 хранятся в массиве чисел. map() выбирает слово на каждой позиции, поэтому результат получается в порядке индексов.

Prompt
Напишите программу на TypeScript, которая создаёт массив из слов one, two, three, four, five, six и массив индексов 3, 5, 0. С помощью map() по индексам соберите слова на этих позициях в том же порядке. Выведите результат.
Вывод: программа на TypeScript и захваченный вывод
Slice by a list of indices

Take и Drop

Take означает оставить некоторое число элементов с одного конца. Drop означает отбросить некоторое число элементов с одного конца и оставить остальные.

Оба — это вызовы slice(). words.slice(0, 3) берёт первые 3 элемента, а words.slice(-3) берёт последние 3. words.slice(1) отбрасывает первый элемент, а words.slice(0, -5) отбрасывает последние 5.

Есть и условные версии: takeWhile, takeLastWhile, dropWhile и dropLastWhile. Они не считают элементы. Они идут с одного конца и останавливаются на первом элементе, который не проходит условие. Встроенных версий нет, поэтому работу выполняет небольшая обобщённая вспомогательная функция: она находит индекс, на котором условие перестаёт выполняться, и возвращает slice() с этого индекса.

Взять первые или последние n элементов

words.slice(0, 3) оставляет первые 3 слова. words.slice(-3) оставляет последние 3, потому что отрицательное начало отсчитывается с конца.

Prompt
Напишите программу на TypeScript, которая создаёт массив из слов one, two, three, four, five, six. С помощью slice() получите первые 3 элемента и последние 3 элемента. Выведите оба результата на отдельных строках.
Вывод: программа на TypeScript и захваченный вывод
Take the first or last n elements

Отбросить первые или последние n элементов

words.slice(1) пропускает первое слово. words.slice(0, -5) пропускает последние 5 слов, поэтому остаётся только one.

Prompt
Напишите программу на TypeScript, которая создаёт массив из слов one, two, three, four, five, six. С помощью slice() получите всё, кроме первого элемента, и всё, кроме последних 5 элементов. Выведите оба результата на отдельных строках.
Вывод: программа на TypeScript и захваченный вывод
Drop the first or last n elements

Брать, пока выполняется условие

takeWhile оставляет слова с начала, пока не встретит слово, начинающееся на f. takeLastWhile оставляет слова с конца, пока не встретит three. startsWith() проверяет начало строки.

Prompt
Напишите программу на TypeScript с обобщёнными вспомогательными функциями takeWhile и takeLastWhile, которые принимают массив и функцию-условие. takeWhile оставляет элементы с начала, пока условие выполняется; takeLastWhile делает то же самое с конца. Примените их к словам one, two, three, four, five, six: оставляйте с начала, пока слово не начинается на f, и оставляйте с конца, пока слово не равно three, затем выведите оба результата.
Вывод: программа на TypeScript и захваченный вывод
Take while a condition holds

Отбрасывать, пока выполняется условие

dropWhile пропускает трёхбуквенные слова в начале и оставляет всё, начиная с three. dropLastWhile пропускает слова с конца, пока они содержат букву i. includes() проверяет, содержит ли строка некоторый фрагмент текста.

Prompt
Напишите программу на TypeScript с обобщёнными вспомогательными функциями dropWhile и dropLastWhile, которые принимают массив и функцию-условие. dropWhile пропускает элементы с начала, пока условие выполняется, и оставляет остальные; dropLastWhile делает то же самое с конца. Примените их к словам one, two, three, four, five, six: пропускайте с начала, пока слово состоит из 3 букв, и пропускайте с конца, пока слово содержит букву i, затем выведите оба результата.
Вывод: программа на TypeScript и захваченный вывод
Drop while a condition holds

Разбиение на части

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

Встроенного метода разбиения нет, но вспомогательная функция коротка: шагайте по массиву с i += size и каждый раз добавляйте items.slice(i, i + size). slice() никогда не читает за концом массива, поэтому короткий последний кусок получается правильным сам собой.

Результат — массив массивов, и каждый кусок сохраняет свои собственные скобки. Node.js печатает этот результат в одну строку: [ [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ], [ 9, 10, 11 ], [ 12, 13 ] ].

Чтобы сразу поработать с каждым куском, добавьте в цепочку map() по частям.

Разрезать на части по 3

Числа от 0 до 13 разрезаны на куски по 3. В последнем куске только 2 элемента: [ 12, 13 ].

Prompt
Напишите программу на TypeScript с обобщённой вспомогательной функцией chunked, которая режет массив на части заданного размера, сохраняя более короткую последнюю часть. Примените её к числам от 0 до 13 с размером 3 и выведите массив частей.
Вывод: программа на TypeScript и захваченный вывод
Split into chunks of 3

Сумма каждой части

Те же куски, но каждый складывается с помощью reduce(). Остаются только суммы: [ 3, 12, 21, 30, 25 ].

Prompt
Напишите программу на TypeScript с обобщённой вспомогательной функцией chunked, которая режет массив на части заданного размера. Примените её к числам от 0 до 13 с размером 3, затем с помощью map() преобразуйте каждую часть в её сумму через reduce() и выведите массив сумм.
Вывод: программа на TypeScript и захваченный вывод
Sum each chunk

Окна

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

Встроенного windowed нет. Это делает цикл for с items.slice(i, i + size). Небольшая обобщённая вспомогательная функция windowed делает это переиспользуемым. С параметром step окно сдвигается сразу на несколько позиций. Если partial равно true, более короткое окно в конце сохраняется, а не отбрасывается.

Окно из 2 элементов, сдвигающееся на 1 шаг, — это то же самое, что составление пары из каждого элемента и следующего за ним. Это цикл, который останавливается за один элемент до конца.

Окна по 3

Окно содержит 3 слова и каждый раз сдвигается на 1 позицию. Цикл останавливается, когда полное окно больше не помещается, поэтому получается 3 окна. Результат — массив массивов, и Node.js печатает его на нескольких строках, по одному окну на строку.

Prompt
Напишите программу на TypeScript с обобщённой вспомогательной функцией windowed, которая принимает массив и размер окна и возвращает каждую группу из такого числа соседних элементов, сдвигаясь на одну позицию за раз. Примените её с размером 3 к словам one, two, three, four, five и выведите результат.
Вывод: программа на TypeScript и захваченный вывод
Windows of 3

Окна с шагом и неполные окна

Окно содержит 3 числа и каждый раз сдвигается на 2 позиции. Поскольку partial равно true, последнее окно [ 9, 10 ] сохраняется, хотя оно короткое.

Prompt
Напишите программу на TypeScript с обобщённой вспомогательной функцией windowed, которая принимает массив, размер окна, шаг и флаг partial. Она сдвигается на step позиций между окнами, а когда partial равно true, оставляет также более короткое окно в конце. Примените её к числам от 1 до 10 с размером 3, шагом 2 и partial, равным true, затем выведите результат.
Вывод: программа на TypeScript и захваченный вывод
Windows with a step and partial windows

Сумма каждого окна

Каждое окно из 3 соседей складывается с помощью reduce(). Остаются только суммы: [ 6, 9, 12 ].

Prompt
Напишите программу на TypeScript, которая создаёт массив чисел от 1 до 5. Пройдите по каждому окну из 3 соседних элементов, сложите окно с помощью reduce() и добавьте сумму в новый массив. Выведите массив сумм.
Вывод: программа на TypeScript и захваченный вывод
Sum each window

Составить пару из каждого элемента и следующего

Первый цикл строит пару из каждого слова и его соседа. Пара — это кортеж, тип [string, string]. Второй цикл сравнивает тех же соседей и записывает, длиннее ли первое слово второго.

Prompt
Напишите программу на TypeScript, которая создаёт массив из слов one, two, three, four, five. Пройдите по нему и составьте пару из каждого элемента и следующего за ним, используя кортежный тип [string, string], и выведите массив пар. Затем пройдите ещё раз и для каждой пары соседей запишите, длиннее ли первое слово второго. Выведите массив логических значений.
Вывод: программа на TypeScript и захваченный вывод
Pair each element with the next one