Превращение цикла в forEach JavaScript

Работа над функцией, которая проверяет, является ли каждое число в arraytrue или false, и возвращает первый истинный number.

Получите рабочее решение с циклом for следующим образом:

function findElement(arr, func) {
  var num;
  for (var a = 0; a < arr.length; a++) {
    if (func(arr[a])) {
      num = arr[a];
      return num;
    }
  }
  return num;
}

findElement([1, 3, 5, 8, 9, 10], function(num) {
  return num % 2 === 0;
})
// Should return 8

Но я пытаюсь (чтобы лучше разобраться в forEach) преобразовать его в цикл forEach.

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

function findElement(arr, func) {
  if (arr.forEach(func) === true) {
    return num;
  }
}
findElement([1, 2, 3, 4], num => num % 2 === 0);
var num; if (num = arr.find(func)) return num;
Ele 20.07.2018 18:55
forEach не может досрочно вернуться.
Evert 20.07.2018 18:56

@Ele А, мне нужно узнать о .find - он идеально подходит для этого (вместе с .filter (func)), но я хотел узнать о forEach!

daggett 20.07.2018 18:57

Итак, вы хотите реализовать forEach?

Prajval M 20.07.2018 19:00
forEach не всегда лучше «простого» for. При этом forEach ничего не возвращает, а также игнорирует то, что возвращает переданная функция обратного вызова.
ASDFGerte 20.07.2018 19:00

@daggett forEach не лучший выбор для этой конкретной проблемы. На самом деле, я редко нахожу это полезным при работе с массивами. map, filter и reduce могут делать большую часть тяжелой работы, хотя есть много других итерационных паттернов. Вашу функцию, вероятно, лучше было бы записать как first([1, 2, 3, 4], num => num % 2 === 0), которая могла бы принимать предикат и возвращать первый результат, соответствующий предикату.

zzzzBov 20.07.2018 19:00

@zzzzBov Правильно, я вижу - так что в этом случае настоящая проблема заключается в том, что forEach на самом деле не тот, который нужно использовать, но мне все еще интересно, можно ли заставить forEach работать, просто из понимания точки метода зрения

daggett 20.07.2018 19:04

@daggett, безусловно, если вы использовали цикл for без break, вы могли бы заставить его работать, установив переменную, внешнюю по отношению к циклу. То же самое можно сделать и с forEach.

zzzzBov 20.07.2018 19:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
407
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Не знаю, как использовать forEach, но вы можете использовать array.prototype.filter:

function findElement(arr, func) {
  return arr.filter(func)[0];
}

@cdhowie предложил использовать array.prototype.find, чтобы использовать [0].

function findElement(arr, func) {
  return arr.find(func);
}

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

Если вы все еще хотите использовать forEach, возможно, вы могли бы сделать что-то вроде этого:

function findElement(arr, func) {
  matches = []
  arr.forEach((item) => {
      if (func(item)) {
          matches.push(item)
      }
  });
  return matches[0];
}

Или же:

function findElement(arr, func) {
  match = null
  arr.forEach((item) => {
     match = (match == null && func(item)) ? item : match
  });
  return match;
}

Опять же, вам нужно будет проверить, как обрабатывать ошибку, если ни один элемент в массиве не соответствует требованиям вашего func.

Любой из обоих кодов производит

console.info(findElement([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; })))
8

Да, это работает - у меня тоже есть это решение. Мне просто интересно узнать о возможностях forEach!

daggett 20.07.2018 19:01

@daggett, я добавил пример с forEach.

Ender Look 20.07.2018 19:06
arr.filter(func)[0] лучше выражается как arr.find(func). Первый будет перебирать весь массив, а второй остановится при первом совпадении.
cdhowie 20.07.2018 19:10

может быть так

function findElement(arr, func) {
  var num = null;

  for (var a = 0; a < arr.length && num === null; a++) {
    var val = arr[a];
    num = func(val) ? val : null; 
  }
  return num;
}

console.info(findElement([1, 3, 5, 8, 9, 10], function(num) {
  return num % 2 === 0;
}));

а где forEach?

r3zaxd1 20.07.2018 19:05

Как уже упоминалось, forEach следует использовать не так.

Однако вы все равно можете добиться желаемого поведения:

function findElement(arr, func) {
  var num;

  arr.forEach(item =>{
    if (func(item)) {
      num = item;
      // .forEach does not have an early return
      // but you can force it to skip elements by removing them
      while (true) {
        // Remove all elements
        var removedItem = arr.shift();
        if (removedItem === undefined) {
          // All elements removed
          break;
        }
    }
  }
  return num;
}

Об этом даже упоминается в документация

function findElement(arr, func) {

    var num;

    arr.forEach(function(element) {
        if (!num && func(element)) {
            num = element;
          }
    });

    return num;
  }

Чтобы узнать больше о параметрах, вы можете проверить этот вопрос: как остановить Javascript forEach?

вот ваш метод findElement с foreach

function findElement(arr, func) {
var num = 0;

arr.forEach(function(item){
 if (func(item))
    return item;
  })
return num;
}

Это всегда будет возвращать 0, поскольку forEach не может выполнить ранний возврат

daggett 20.07.2018 19:15

Другие вопросы по теме