From d6da2b33c3ceb1e87bd91ab68415a71893ff3601 Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Sun, 15 Mar 2026 18:59:10 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 js/iterator-filter/index.md diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md new file mode 100644 index 0000000000..2f620cc002 --- /dev/null +++ b/js/iterator-filter/index.md @@ -0,0 +1,38 @@ +--- +title: "Iterator.prototype.filter()" +description: "Возвращает итератор, из которого можно получить только отфильтрованные значения" +baseline: + - group: iterator-methods + features: + - javascript.builtins.Iterator.filter +authors: + - vitya-ne +related: + - js/iterator + - js/iterator-to-array + - js/iterator-take +tags: + - doka +--- + +## Кратко + +`Iterator.prototype.filter()` создаёт итератор только с теми значениями, которые удовлетворяют условию callback-функции. Фильтрация значений выполняется по мере необходимости (lazy evaluation). При каждом вызове метода `next()` итератор, будет возвращать следующее подходящее значение исходного итератора, определённое с помощью callback-функции. О том, что такое итератор, можно прочитать в статье [«Итератор»](/js/iterator/). + +## Пример + + + +## Как пишется + +`Iterator.prototype.filter()` принимает один обязательный аргумент — функцию. + +`Iterator.prototype.filter()` возвращает новый итератор. + + +## Как понять + + + +## Подсказки + From 2b03eeee6f83dc7cbfbd8bab6c42c1ef99f18dbb Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:00:39 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index 2f620cc002..82acbfedac 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -23,6 +23,7 @@ tags: + ## Как пишется `Iterator.prototype.filter()` принимает один обязательный аргумент — функцию. @@ -32,6 +33,28 @@ tags: ## Как понять +Итератор, созданный методом `Iterator.prototype.filter()`, использует исходный итератор как источник данных. + + + +У нас есть функция-генератор id, состоящих из 4-х цифр: + +```js +function* idGenerator(length = 4) { + const charset = '0123456789' + + while (true) { + let id = ''; + for (let i = 0; i < length; i++) { + const random = Math.floor(Math.random() * charset.length); + id += charset[random]; + } + yield id; + } +} +``` + +Необходимо получить 10 id-значений в которых одна из цифр повторятся не менее 2 раз. ## Подсказки From b5949aa9d3e18a3c94654cfa4e15293c91f310ca Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Wed, 18 Mar 2026 09:55:34 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index 82acbfedac..80e9d0900c 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -21,12 +21,24 @@ tags: ## Пример +Представим, что у нас есть итератор для массива чисел. +Необходимо получить только чётные значения: +```js +// Итератор для массива +const iterator = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].values() + +// Создаём итератор для получения чётных чисел +const evenIterator = iterator.filter(num => num % 2 === 0) +// Получаем чётные значения +console.log(evenIterator.toArray()) +// [ 2, 4, 6, 8, 10 ] +``` ## Как пишется -`Iterator.prototype.filter()` принимает один обязательный аргумент — функцию. +`Iterator.prototype.filter()` принимает один обязательный аргумент — callback-функцию. `Iterator.prototype.filter()` возвращает новый итератор. From 2b969b3754786c7650027de9d9e83120f8a3f66d Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Fri, 20 Mar 2026 10:27:34 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20'=D0=9A=D0=B0=D0=BA=20=D0=BF=D0=B8=D1=88?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index 80e9d0900c..279fbcf9b8 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -17,7 +17,7 @@ tags: ## Кратко -`Iterator.prototype.filter()` создаёт итератор только с теми значениями, которые удовлетворяют условию callback-функции. Фильтрация значений выполняется по мере необходимости (lazy evaluation). При каждом вызове метода `next()` итератор, будет возвращать следующее подходящее значение исходного итератора, определённое с помощью callback-функции. О том, что такое итератор, можно прочитать в статье [«Итератор»](/js/iterator/). +`Iterator.prototype.filter()` создаёт итератор только с теми значениями, которые удовлетворяют условию callback-функции. Фильтрация значений выполняется по мере необходимости (lazy evaluation). При каждом вызове метода [`next()`](/js/iterator/#kak-ponyat) , итератор будет возвращать следующее подходящее значение исходного итератора, определённое с помощью callback-функции. О том, что такое итератор, можно прочитать в статье [«Итератор»](/js/iterator/). ## Пример @@ -40,14 +40,22 @@ console.log(evenIterator.toArray()) `Iterator.prototype.filter()` принимает один обязательный аргумент — callback-функцию. -`Iterator.prototype.filter()` возвращает новый итератор. +При вызове callback-функция получает аргументы: +- element — текущее значение итератора; +- index — индекс значения; -## Как понять +Функция выполняется для каждого значения, которое извлекается из итератора. Она вызывается не сразу для всех элементов, а только в случае запроса данных (например, при вызове `.next()` или переборе в цикле [`for...of`](/js/for-of/)). -Итератор, созданный методом `Iterator.prototype.filter()`, использует исходный итератор как источник данных. +Если результат функции это `false` или другое [falsy](/js/boolean/#vyrazheniya), то callback-функция будет вызываться для следующих значений итератора, пока не вернёт истинное значение. В этом случае текущее значение итератора будет возвращено как результат. + +Если попытаться выполнить `Iterator.prototype.filter()` без аргумента или передать значение не функцию, будет брошена ошибка `TypeError`. +`Iterator.prototype.filter()` возвращает новый итератор. + +## Как понять +Итератор, созданный методом `Iterator.prototype.filter()`, использует исходный итератор как источник данных. У нас есть функция-генератор id, состоящих из 4-х цифр: From 245fe4b659cdab5e2a4e3f2838bb30c52575c5a9 Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Sat, 21 Mar 2026 23:23:26 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=BF=D1=80=D0=BE=20=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B5=D0=B5=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 39 +++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index 279fbcf9b8..b6962beacb 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -17,7 +17,7 @@ tags: ## Кратко -`Iterator.prototype.filter()` создаёт итератор только с теми значениями, которые удовлетворяют условию callback-функции. Фильтрация значений выполняется по мере необходимости (lazy evaluation). При каждом вызове метода [`next()`](/js/iterator/#kak-ponyat) , итератор будет возвращать следующее подходящее значение исходного итератора, определённое с помощью callback-функции. О том, что такое итератор, можно прочитать в статье [«Итератор»](/js/iterator/). +`Iterator.prototype.filter()` создаёт итератор только с теми значениями, которые удовлетворяют условию callback-функции. Фильтрация значений выполняется по мере необходимости (lazy evaluation). При каждом вызове метода [`next()`](/js/iterator/#kak-ponyat), итератор будет возвращать следующее подходящее значение исходного итератора, определённое с помощью callback-функции. О том, что такое итератор, можно прочитать в статье [«Итератор»](/js/iterator/). ## Пример @@ -55,7 +55,42 @@ console.log(evenIterator.toArray()) ## Как понять -Итератор, созданный методом `Iterator.prototype.filter()`, использует исходный итератор как источник данных. + + +Итератор, созданный методом `Iterator.prototype.filter()`, использует исходный итератор как источник данных и разделяет с ним состояние (указатель на текущее значение). Если вызвать `next()` на одном из итераторов, указатель сдвинется для обоих — как для исходного, так и для отфильтрованного. + +Рассмотрим ещё один пример получения чётных значений: + +```js +// Итератор для массива +const iterator = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].values() + +// Создаём итератор для получения чётных чисел +const evenIterator = iterator.filter(num => num % 2 === 0) + +// Получаем первое чётное значение +console.log(evenIterator.next().value) +// 2 + +// Получаем два значения исходного итератора +console.log(iterator.next().value) +console.log(iterator.next().value) +// 3 +// 4 + +// Получаем следующее чётное значение +console.log(evenIterator.next().value) +// 6 +``` + +- "Получаем первое чётное значение" — `evenIterator` выполняет callback-функцию для значений 1 и 2. Следующее доступное значение для обоих итераторов — 3. + +- "Получаем два значения исходного итератора". Следующее доступное значение для обоих итераторов — 5. + +- "Получаем следующее чётное значение" — `evenIterator` выполняет callback-функцию для значений 5 и 6. + + + У нас есть функция-генератор id, состоящих из 4-х цифр: From 4e3f6548a4bd9325e5c09aad574d673e1494beda Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Tue, 24 Mar 2026 10:20:55 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20"=D0=9A=D0=B0=D0=BA=20=D0=BF=D0=BE=D0=BD?= =?UTF-8?q?=D1=8F=D1=82=D1=8C"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 77 +++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index b6962beacb..c76fe2b410 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -55,11 +55,52 @@ console.log(evenIterator.toArray()) ## Как понять +Метод `Iterator.prototype.filter()` можно сравнить с методом массивов [`Array.prototype.filter()`](/js/array-filter/). Оба метода применяются для фильтрации коллекции значения с помощью callback-функции. +В отличии от массивов, методы `Iterator.prototype`, выполняют «ленивые» вычисления (lazy evaluation). Это позволяет не перегружать память, избегать лишних операций, а главное — даёт возможность работать с большими или бесконечными потоками данных (лог-файлы, сенсоры, генераторы). + + +Рассмотрим, как можно выполнять фильтрацию данных полученных из [генератора](/js/generators/). +У нас есть функция-генератор пин-кодов, состоящих из 4-х цифр: + +```js +function* pinGenerator(length = 8) { + const charset = '01234567890123456789' + + while (true) { + let id = ''; + for (let i = 0; i < length; i++) { + const random = Math.floor(Math.random() * charset.length); + id += charset[random]; + } + yield id; + } +} +``` + +При вызове, функция вернёт итератор: + +```js +const pins = pinGenerator(4) + +console.log(pins.next().value) +// 6147 +console.log(pins.next().value) +// 1848 +``` + +Для удобства ввода данных, необходимо получать пин-коды, в которых одна из цифр повторятся дважды. +Применим фильтрацию к исходному итератору: + + + + + +Как и другие методы доступные через `Iterator.prototype`, `filter()` выполняет для исходного итератора роль обёртки (wrapper), добавляя логику фильтрации. Итератор, созданный методом `Iterator.prototype.filter()`, использует исходный итератор как источник данных и разделяет с ним состояние (указатель на текущее значение). Если вызвать `next()` на одном из итераторов, указатель сдвинется для обоих — как для исходного, так и для отфильтрованного. -Рассмотрим ещё один пример получения чётных значений: +Рассмотрим связь итераторов на примере получения чётных значений: ```js // Итератор для массива @@ -68,49 +109,29 @@ const iterator = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].values() // Создаём итератор для получения чётных чисел const evenIterator = iterator.filter(num => num % 2 === 0) -// Получаем первое чётное значение +// evenIterator выполняет callback-функцию для значений 1 и 2 +// Получаем первое чётное значение — 2 console.log(evenIterator.next().value) // 2 -// Получаем два значения исходного итератора +// Следующее доступное значение для обоих итераторов — 3 +// Получаем два значения исходного итератора: 3 и 4 console.log(iterator.next().value) console.log(iterator.next().value) // 3 // 4 -// Получаем следующее чётное значение +// Следующее доступное значение для обоих итераторов — 5 +// evenIterator` выполняет callback-функцию для значений 5 и 6. +// Получаем следующее чётное значение — 6 console.log(evenIterator.next().value) // 6 ``` -- "Получаем первое чётное значение" — `evenIterator` выполняет callback-функцию для значений 1 и 2. Следующее доступное значение для обоих итераторов — 3. - -- "Получаем два значения исходного итератора". Следующее доступное значение для обоих итераторов — 5. - -- "Получаем следующее чётное значение" — `evenIterator` выполняет callback-функцию для значений 5 и 6. -У нас есть функция-генератор id, состоящих из 4-х цифр: - -```js -function* idGenerator(length = 4) { - const charset = '0123456789' - - while (true) { - let id = ''; - for (let i = 0; i < length; i++) { - const random = Math.floor(Math.random() * charset.length); - id += charset[random]; - } - yield id; - } -} -``` - -Необходимо получить 10 id-значений в которых одна из цифр повторятся не менее 2 раз. - ## Подсказки From 547049f2cba321ac6236ed0e9679abfcbb8e96ab Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Wed, 25 Mar 2026 10:38:20 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 48 ++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index c76fe2b410..8322ad51e7 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -17,7 +17,7 @@ tags: ## Кратко -`Iterator.prototype.filter()` создаёт итератор только с теми значениями, которые удовлетворяют условию callback-функции. Фильтрация значений выполняется по мере необходимости (lazy evaluation). При каждом вызове метода [`next()`](/js/iterator/#kak-ponyat), итератор будет возвращать следующее подходящее значение исходного итератора, определённое с помощью callback-функции. О том, что такое итератор, можно прочитать в статье [«Итератор»](/js/iterator/). +`Iterator.prototype.filter()` создаёт итератор только с теми значениями, которые удовлетворяют условию колбэк-функции. Фильтрация значений выполняется по мере необходимости (lazy evaluation). При каждом вызове метода [`next()`](/js/iterator/#kak-ponyat), итератор будет возвращать следующее подходящее значение исходного итератора, определённое с помощью колбэк-функции. О том, что такое итератор, можно прочитать в статье [«Итератор»](/js/iterator/). ## Пример @@ -38,16 +38,16 @@ console.log(evenIterator.toArray()) ## Как пишется -`Iterator.prototype.filter()` принимает один обязательный аргумент — callback-функцию. +`Iterator.prototype.filter()` принимает один обязательный аргумент — колбэк-функцию. -При вызове callback-функция получает аргументы: +При вызове колбэк-функция получает аргументы: - element — текущее значение итератора; - index — индекс значения; Функция выполняется для каждого значения, которое извлекается из итератора. Она вызывается не сразу для всех элементов, а только в случае запроса данных (например, при вызове `.next()` или переборе в цикле [`for...of`](/js/for-of/)). -Если результат функции это `false` или другое [falsy](/js/boolean/#vyrazheniya), то callback-функция будет вызываться для следующих значений итератора, пока не вернёт истинное значение. В этом случае текущее значение итератора будет возвращено как результат. +Если результат функции это `false` или другое [falsy](/js/boolean/#vyrazheniya), то колбэк-функция будет вызываться для следующих значений итератора, пока не вернёт истинное значение. В этом случае текущее значение итератора будет возвращено как результат. Если попытаться выполнить `Iterator.prototype.filter()` без аргумента или передать значение не функцию, будет брошена ошибка `TypeError`. @@ -55,13 +55,14 @@ console.log(evenIterator.toArray()) ## Как понять -Метод `Iterator.prototype.filter()` можно сравнить с методом массивов [`Array.prototype.filter()`](/js/array-filter/). Оба метода применяются для фильтрации коллекции значения с помощью callback-функции. +Метод `Iterator.prototype.filter()` можно сравнить с методом массивов [`Array.prototype.filter()`](/js/array-filter/). Оба метода применяются для фильтрации коллекции значения с помощью колбэк-функции. В отличии от массивов, методы `Iterator.prototype`, выполняют «ленивые» вычисления (lazy evaluation). Это позволяет не перегружать память, избегать лишних операций, а главное — даёт возможность работать с большими или бесконечными потоками данных (лог-файлы, сенсоры, генераторы). Рассмотрим, как можно выполнять фильтрацию данных полученных из [генератора](/js/generators/). -У нас есть функция-генератор пин-кодов, состоящих из 4-х цифр: + +У нас есть функция-генератор пин-кодов: ```js function* pinGenerator(length = 8) { @@ -78,7 +79,7 @@ function* pinGenerator(length = 8) { } ``` -При вызове, функция вернёт итератор: +При вызове, функция вернёт итератор. Создадим итератор пин-кодов из 4-х цифр и получим несколько значений: ```js const pins = pinGenerator(4) @@ -89,12 +90,30 @@ console.log(pins.next().value) // 1848 ``` -Для удобства ввода данных, необходимо получать пин-коды, в которых одна из цифр повторятся дважды. -Применим фильтрацию к исходному итератору: - +Для удобства ввода в приложении, необходимо получать пин-коды, в которых одна из цифр повторятся дважды. +Применим фильтрацию к исходному итератору и создадим итератор отфильтрованных значений. Будем проверять сколько уникальных цифр содержит строка. Если одна из цифр повторяется дважды, размер Set-коллекции будет равен 3: +```js +const easyPins = pins.filter(pin => { + const digits = pin.split('') + const uniqueDigits = new Set(digits) + + // Если в строке ровно 3 уникальные цифры, + // значит одна цифра повторяется дважды + return uniqueDigits.size === 3 +}) + +console.log(easyPins.next().value) +// 3319 +console.log(easyPins.next().value) +// 4008 +console.log(easyPins.next().value) +// 0226 +``` +Оба итератора «бесконечны», так как не имеют конечного состояния (`{ done:true }`). +Фильтрация работает, потому что колбэк-функция начинает выполняться только при запросе отфильтрованных значений и не будет вызываться для следующих значений итератора после получения первого истинного значения. Как и другие методы доступные через `Iterator.prototype`, `filter()` выполняет для исходного итератора роль обёртки (wrapper), добавляя логику фильтрации. @@ -109,7 +128,7 @@ const iterator = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].values() // Создаём итератор для получения чётных чисел const evenIterator = iterator.filter(num => num % 2 === 0) -// evenIterator выполняет callback-функцию для значений 1 и 2 +// evenIterator выполняет колбэк-функцию для значений 1 и 2 // Получаем первое чётное значение — 2 console.log(evenIterator.next().value) // 2 @@ -122,16 +141,11 @@ console.log(iterator.next().value) // 4 // Следующее доступное значение для обоих итераторов — 5 -// evenIterator` выполняет callback-функцию для значений 5 и 6. +// evenIterator` выполняет колбэк-функцию для значений 5 и 6. // Получаем следующее чётное значение — 6 console.log(evenIterator.next().value) // 6 ``` - - - - - ## Подсказки From 28dfec5800225c4c487cdc79deffc5bdc5bd2a64 Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Fri, 27 Mar 2026 10:29:00 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=D0=92=D0=BD=D0=BE=D1=81=D0=B8=D1=82=20?= =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index 8322ad51e7..cd4c8b6a25 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -55,11 +55,10 @@ console.log(evenIterator.toArray()) ## Как понять -Метод `Iterator.prototype.filter()` можно сравнить с методом массивов [`Array.prototype.filter()`](/js/array-filter/). Оба метода применяются для фильтрации коллекции значения с помощью колбэк-функции. +Метод `Iterator.prototype.filter()` можно сравнить с методом массивов [`Array.prototype.filter()`](/js/array-filter/). Оба метода применяются для фильтрации значений с помощью колбэк-функции. В отличии от массивов, методы `Iterator.prototype`, выполняют «ленивые» вычисления (lazy evaluation). Это позволяет не перегружать память, избегать лишних операций, а главное — даёт возможность работать с большими или бесконечными потоками данных (лог-файлы, сенсоры, генераторы). - Рассмотрим, как можно выполнять фильтрацию данных полученных из [генератора](/js/generators/). У нас есть функция-генератор пин-кодов: @@ -90,11 +89,12 @@ console.log(pins.next().value) // 1848 ``` -Для удобства ввода в приложении, необходимо получать пин-коды, в которых одна из цифр повторятся дважды. +Допустим, что для удобства ввода в приложении, необходимо получать пин-коды, в которых одна из цифр повторятся дважды. -Применим фильтрацию к исходному итератору и создадим итератор отфильтрованных значений. Будем проверять сколько уникальных цифр содержит строка. Если одна из цифр повторяется дважды, размер Set-коллекции будет равен 3: +Применим фильтрацию к исходному итератору и создадим итератор отфильтрованных значений. Колбэк-функция будет проверять сколько уникальных цифр содержит строка. Если одна из цифр повторяется дважды, размер Set-коллекции будет равен 3: ```js +// Создаём итератор для получения пик-кодов с повторяющейся цифрой const easyPins = pins.filter(pin => { const digits = pin.split('') const uniqueDigits = new Set(digits) @@ -113,7 +113,7 @@ console.log(easyPins.next().value) ``` Оба итератора «бесконечны», так как не имеют конечного состояния (`{ done:true }`). -Фильтрация работает, потому что колбэк-функция начинает выполняться только при запросе отфильтрованных значений и не будет вызываться для следующих значений итератора после получения первого истинного значения. +Фильтрация работает, потому что колбэк-функция начинает выполняться только при запросе отфильтрованных значений и не вызывается для следующих значений итератора после получения истинного (truthy) значения. Как и другие методы доступные через `Iterator.prototype`, `filter()` выполняет для исходного итератора роль обёртки (wrapper), добавляя логику фильтрации. From 00ba62ce131c444278309120068a1dc0b6eec23f Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Mon, 30 Mar 2026 22:14:32 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D1=82=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D1=82=D1=8B=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/iterator-filter/index.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/js/iterator-filter/index.md b/js/iterator-filter/index.md index cd4c8b6a25..12bc7e0c76 100644 --- a/js/iterator-filter/index.md +++ b/js/iterator-filter/index.md @@ -129,7 +129,7 @@ const iterator = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].values() const evenIterator = iterator.filter(num => num % 2 === 0) // evenIterator выполняет колбэк-функцию для значений 1 и 2 -// Получаем первое чётное значение — 2 +// Получаем первое чётное значение console.log(evenIterator.next().value) // 2 @@ -141,11 +141,8 @@ console.log(iterator.next().value) // 4 // Следующее доступное значение для обоих итераторов — 5 -// evenIterator` выполняет колбэк-функцию для значений 5 и 6. -// Получаем следующее чётное значение — 6 +// evenIterator выполняет колбэк-функцию для значений 5 и 6. +// Получаем следующее чётное значение console.log(evenIterator.next().value) // 6 ``` - -## Подсказки - From 033a82cf36f45039c69148b7246add795c3393bf Mon Sep 17 00:00:00 2001 From: vitya-ne <9317613+vitya-ne@users.noreply.github.com> Date: Sat, 4 Apr 2026 21:17:03 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=B4=D0=BE=D0=BA=D1=83=20=D0=B2=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=B4=D0=B5=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/js/index.md b/js/index.md index 305a346235..5caf29bea1 100644 --- a/js/index.md +++ b/js/index.md @@ -162,6 +162,7 @@ groups: - iterator - iterator-take - iterator-to-array + - iterator-filter - name: "Обработка исключений" items: - try-catch