Работа над функцией, которая проверяет, является ли каждое число в 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);
forEach не может досрочно вернуться.
@Ele А, мне нужно узнать о .find - он идеально подходит для этого (вместе с .filter (func)), но я хотел узнать о forEach!
Итак, вы хотите реализовать forEach?
forEach не всегда лучше «простого» for. При этом forEach ничего не возвращает, а также игнорирует то, что возвращает переданная функция обратного вызова.
@daggett forEach не лучший выбор для этой конкретной проблемы. На самом деле, я редко нахожу это полезным при работе с массивами. map, filter и reduce могут делать большую часть тяжелой работы, хотя есть много других итерационных паттернов. Вашу функцию, вероятно, лучше было бы записать как first([1, 2, 3, 4], num => num % 2 === 0), которая могла бы принимать предикат и возвращать первый результат, соответствующий предикату.
@zzzzBov Правильно, я вижу - так что в этом случае настоящая проблема заключается в том, что forEach на самом деле не тот, который нужно использовать, но мне все еще интересно, можно ли заставить forEach работать, просто из понимания точки метода зрения
@daggett, безусловно, если вы использовали цикл for без break, вы могли бы заставить его работать, установив переменную, внешнюю по отношению к циклу. То же самое можно сделать и с forEach.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Не знаю, как использовать 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, я добавил пример с forEach.
arr.filter(func)[0] лучше выражается как arr.find(func). Первый будет перебирать весь массив, а второй остановится при первом совпадении.
может быть так
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?
Как уже упоминалось, 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 не может выполнить ранний возврат
var num; if (num = arr.find(func)) return num;