Js foreach return не работает

просто forEach возвращает undefined, я перемещаю console.log, и он работает — почему?

Спасибо — я не уверен, почему это возвращает неопределенное.

Но это работает?

Любое руководство будет очень признательно.

Как бы я отделить console.log от логики?

6 ответов

Как упомянул @ zimri-leijen, forEach — простой итератор, который ничего не возвращает.

Но вы можете использовать свойство .map , если хотите выполнить операцию над элементами и вернуть что-то по индексам.

forEach в javascript похож на простой цикл. он просто перебирает массив и выполняет действие с каждым элементом, но ничего не возвращает. Вот почему во втором случае он вызывает console.log для каждого элемента, который просто печатает его. Даже если вы не вернете console.log, он все равно будет вести себя так же.

Поэтому, если вы хотите, чтобы итератор возвращал элемент после каждой итерации, лучше использовать map . Самое лучшее в map — это то, что он всегда возвращает новый массив после выполнения действий над каждым элементом. Так что полная неизменность.

Вышеуказанная функция с использованием map может быть записана как:

Возвращаемое значение: undefined

Мы можем расширить первый блок кода, чтобы получить эквивалентный код следующим образом:

Метод forEach () дает элементы в массиве один за другим . Если вы попытаетесь вернуть что-то в методе forEach (), он возвращает неопределенное значение ..

Если вы скажете мне, что именно вы хотите сделать, тогда я могу помочь вам .

Рассмотрим только вашу первую функцию. Когда вы вызываете его whatever() , вы также получаете вывод undefined , но вы не отображаете его в консоли.

Источник

Can forEach in JavaScript make a return? [duplicate]

I wonder if forEach in JavaScript can make a return, here is my code:

I want to find out if 2 is in my array, if so, return false, but it seems that the forEach function has looped the whole array and ignore return.

I wonder if I can get the answer I want with forEach ( I know I can get what I want using for(..))? dear friend, pls help me, with great thanks!

6 Answers 6

Note: There is no way to stop or break a forEach() loop other than by throwing an exception. If you need such behaviour, the .forEach() method is the wrong tool, use a plain loop instead.

So, the return value cannot be used the way you are using it. However you could do a throw (which is not recommended unless you actually need an error to be raised there)

In this case .indexOf() is probably what you want, but there’s also .some() when a simple equality comparison is too simple:

The .some() function returns true if the callback returns true for any element. (The function returns as soon as the callback does return true , so it doesn’t bother looking beyond the first match.)

You can usually use the .reduce() function as a more general iteration mechanism. If you wanted to count how many instances of 2 were in your array for example:

Others have mentioned .indexOf() and .some() . I thought I would add that a good old fashioned for loop gives you the absolute most iteration control because you control the iteration and your processing code is not embedded in a callback function.

While .indexOf() already does exactly what you need, this code just shows how you can directly return when using the old fashioned for loop. It is somehow out of favor these days, but is often still the best choice for better looping control.

Using the for loop, you can iterate backwards (useful when removing items from the array during the iteration), you can insert items and correct the iteration index, you can immediately return, you can skip indexes, etc.

Источник

просто forEach возвращает undefined, я перемещаю console.log, и он работает — почему?

Спасибо — я не уверен, почему это возвращает неопределенное.

Но это работает?

Любое руководство будет очень признательно.

Как бы я отделить console.log от логики?

6 ответов

Как упомянул @ zimri-leijen, forEach — простой итератор, который ничего не возвращает.

Но вы можете использовать свойство .map , если хотите выполнить операцию над элементами и вернуть что-то по индексам.

forEach в javascript похож на простой цикл. он просто перебирает массив и выполняет действие с каждым элементом, но ничего не возвращает. Вот почему во втором случае он вызывает console.log для каждого элемента, который просто печатает его. Даже если вы не вернете console.log, он все равно будет вести себя так же.

Поэтому, если вы хотите, чтобы итератор возвращал элемент после каждой итерации, лучше использовать map . Самое лучшее в map — это то, что он всегда возвращает новый массив после выполнения действий над каждым элементом. Так что полная неизменность.

Вышеуказанная функция с использованием map может быть записана как:

Возвращаемое значение: undefined

Мы можем расширить первый блок кода, чтобы получить эквивалентный код следующим образом:

Метод forEach () дает элементы в массиве один за другим . Если вы попытаетесь вернуть что-то в методе forEach (), он возвращает неопределенное значение ..

Если вы скажете мне, что именно вы хотите сделать, тогда я могу помочь вам .

Рассмотрим только вашу первую функцию. Когда вы вызываете его whatever() , вы также получаете вывод undefined , но вы не отображаете его в консоли.

Источник

Массив: перебирающие методы

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/array-methods.

Современный стандарт JavaScript предоставляет много методов для «умного» перебора массивов, которые есть в современных браузерах…

…Ну а для их поддержки в IE8- просто подключите библиотеку ES5-shim.

forEach

Метод «arr.forEach(callback[, thisArg])» используется для перебора массива.

Он для каждого элемента массива вызывает функцию callback .

Этой функции он передаёт три параметра callback(item, i, arr) :

  • item – очередной элемент массива.
  • i – его номер.
  • arr – массив, который перебирается.

Второй, необязательный аргумент forEach позволяет указать контекст this для callback . Мы обсудим его в деталях чуть позже, сейчас он нам не важен.

Метод forEach ничего не возвращает, его используют только для перебора, как более «элегантный» вариант, чем обычный цикл for .

filter

Метод «arr.filter(callback[, thisArg])» используется для фильтрации массива через функцию.

Он создаёт новый массив, в который войдут только те элементы arr , для которых вызов callback(item, i, arr) возвратит true .

Метод «arr.map(callback[, thisArg])» используется для трансформации массива.

Он создаёт новый массив, который будет состоять из результатов вызова callback(item, i, arr) для каждого элемента arr .

every/some

Эти методы используются для проверки массива.

  • Метод «arr.every(callback[, thisArg])» возвращает true , если вызов callback вернёт true для каждого элемента arr .
  • Метод «arr.some(callback[, thisArg])» возвращает true , если вызов callback вернёт true для какого-нибудь элемента arr .

reduce/reduceRight

Метод «arr.reduce(callback[, initialValue])» используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата.

Это один из самых сложных методов для работы с массивами. Но его стоит освоить, потому что временами с его помощью можно в несколько строк решить задачу, которая иначе потребовала бы в разы больше места и времени.

Метод reduce используется для вычисления на основе массива какого-либо единого значения, иначе говорят «для свёртки массива». Чуть далее мы разберём пример для вычисления суммы.

Он применяет функцию callback по очереди к каждому элементу массива слева направо, сохраняя при этом промежуточный результат.

Аргументы функции callback(previousValue, currentItem, index, arr) :

  • previousValue – последний результат вызова функции, он же «промежуточный результат».
  • currentItem – текущий элемент массива, элементы перебираются по очереди слева-направо.
  • index – номер текущего элемента.
  • arr – обрабатываемый массив.

Кроме callback , методу можно передать «начальное значение» – аргумент initialValue . Если он есть, то на первом вызове значение previousValue будет равно initialValue , а если у reduce нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.

Проще всего понять работу метода reduce на примере.

Например, в качестве «свёртки» мы хотим получить сумму всех элементов массива.

Вот решение в одну строку:

Разберём, что в нём происходит.

При первом запуске sum – исходное значение, с которого начинаются вычисления, равно нулю (второй аргумент reduce ).

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

Поток вычислений получается такой

В виде таблицы где каждая строка – вызов функции на очередном элементе массива:

sum current результат
первый вызов 0 1 1
второй вызов 1 2 3
третий вызов 3 3 6
четвёртый вызов 6 4 10
пятый вызов 10 5 15

Как видно, результат предыдущего вызова передаётся в первый аргумент следующего.

Кстати, полный набор аргументов функции для reduce включает в себя function(sum, current, i, array) , то есть номер текущего вызова i и весь массив arr , но здесь в них нет нужды.

Посмотрим, что будет, если не указать initialValue в вызове arr.reduce :

Результат – точно такой же! Это потому, что при отсутствии initialValue в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.

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

Метод arr.reduceRight работает аналогично, но идёт по массиву справа-налево.

Итого

Мы рассмотрели методы:

  • forEach – для перебора массива.
  • filter – для фильтрации массива.
  • every/some – для проверки массива.
  • map – для трансформации массива в массив.
  • reduce/reduceRight – для прохода по массиву с вычислением значения.

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

Источник

Прервать цикл forEach (javascript)

Есть массив со значениями.

Внутри цикла есть условие поиска значения массива.

Задача: остановить дальнейший перебор цикла при первом найденном значении.

Спасибо за помощь.

Решение: (спасибо Lieutenant Jim Dangle)

4 ответа 4

метод forEach не предусматривает возможности прервать обход коллекции.

Если нужно проверить наличие конкретного элемента удовлетворяющего условию, лучше использовать метод some

Если проверяются полностью объекты, можно использовать метод indexOf

Если нужно найти индекс элемента удовлетворяющего условию, то подойдет метод findIndex

Если очень хочется использовать именно forEach — можно поместить его в try..catch и кидать ошибку если элемент найден.

Вместо встроенных функций массива, можно также воспользоваться циклом for . В этом случае для прерывания цикла можно использовать выражение break

В методе forEach не предусмотренa остановка как в лупе посредством брейк.

Использовать every заместо forEach . Когда будет false , все остановится.

Это самый правильный способ.

Mожно остановить loop посредством вызова несуществующей функции и перехвата ошибки:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками javascript foreach или задайте свой вопрос.

Связанные

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.15.40479

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Читайте также:  Газовая плита гефест не работает конфорка гаснет если отпустить кнопку
Оцените статью