Введение
Для изучения для каждого метода , понять синтаксис:
arr.forEach(function callback(currentValue [, index [, array]]) {
//your iterator
}[, thisArg]);
Как видите, функция обратного вызова имеет еще два параметра: помимо значения есть индекс этого значения и сам массив. Есть также второй аргумент для самого forEach, который может устанавливать контекст (полезно при итерации чего-либо в объекте).
Уровень 1
Если вы хотите использовать forEach для поиска значения, функция поиска должна возвращать функцию обратного вызова (мы вызываем эту конструкцию closure ):
phoneBook.forEach(search("Fede"))
function search(name) {
return function(value, position) {
if (name === value.name) {
document.write(value.name + value.number);
document.write(" found at position "+position);
}
}
}
Уровень 2
Или вы можете (ab) использовать параметр thisArg forEach:
phoneBook.forEach(search,"Fede")
function search(value) {
if (this == value.name) { // Fede was passed to this
document.write(value.name + value.number);
}
}
Обратите внимание на оператор ==
вместо ===
: Fede был передан как объект String, но значение.name здесь просто строковый литерал (другого типа).
Для этой цели, однако, вы должны использовать метод find , где обратный вызов принимает те же аргументы:
function search(value) {
return this == value.name;
}
var fede = phoneBook.find(search,"Fede");
if(fede) document.write(fede.name + fede.number);
Уровень 3
Пока вы учитесь, для такой простой однострочной функции есть более удобные функции стрелок . Они немного отличаются, контекст не может быть передан, например, методом find или forEach. Тем не менее, вы можете еще больше упростить поиск до одной строки:
var fede = phoneBook.find(value => "Fede" === value.name);