Отладка цикла forEach, чтобы понять, как он работает - PullRequest
2 голосов
/ 05 мая 2019

Буду рад вашей помощи в следующем простом упражнении. Я учусь для каждого, но я не уверен, где ошибка. Пробовал несколькими способами чтобы решить ее, но все равно получаю ошибку.

Моя цель - запустить массив телефонной книги и отобразить на запишите соответствующее имя и номер.

Пример: если я ищу "Fede", я должен получить в результате "Fede1234"

var phoneBook = [{
  name: "Fede",
  number: "1234"
}, {
  name: "Marco",
  number: "5678"
}]

phoneBook.forEach(search(name))

function search(name) {
  if (name === phoneBook.name) {
    document.write(phoneBook.name + phoneBook.number)
  }
}

Ответы [ 3 ]

2 голосов
/ 05 мая 2019

Несколько вещей происходит здесь.В этой строке: phoneBook.forEach(search(name)) переменная name не определена.если вы хотите передать каждый объект, строка должна выглядеть так:

phoneBook.forEach(search)

Это автоматически передаст каждый объект в функцию поиска.

сама функция поискатакже есть несколько проблем:

function search(name) {
  if (name === phoneBook.name) {
      document.write(phoneBook.name + phoneBook.number)
  }
}

В этом случае name - это весь объект.Кроме того, поскольку phonebook является массивом, вызов phonebook.name не будет ничего возвращать.

Попробуйте:

var phoneBook = [{name: "Fede" , number: "1234"}, {name: "Marco" , number: "5678"}]
var name = "Fede";
phoneBook.forEach(search)

function search(object) {
  if (name === object.name) {
  document.write(object.name + object.number)
  }
}

Теперь определено name, и функция поиска выполняетсяприменяется к каждому объекту в телефонной книге.

1 голос
/ 05 мая 2019
var phoneBook = [{name: "Fede" , number: "1234"}, {name: "Marco" , number: "5678"}]
phoneBook.forEach(search);

function search(name) {
  if (name === "???") {
    document.write(phoneBook.name + phoneBook.number)
  }
}
0 голосов
/ 05 мая 2019

Введение

Для изучения для каждого метода , понять синтаксис:

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);
...